javascript - 你如何链接 promise 但将类型从一个然后更改为另一个?

标签 javascript angularjs node.js typescript promise

我对 nodejs/typescript/promises 比较陌生,所以我不确定链接 promises 的正确方法。

我有一个帮助程序类调用 REST api 来获取基于 ip 的地理位置。我对整个响应不感兴趣,只对城市领域感兴趣。我如何正确返回一个 promise ,即在解决时仅获取城市字段?

var rest = require("axios");
const ENDPOINT = "http://freegeoip.net/json/";
@Service()
export class GeoIp {
    city(ip: string): Promise<any> {
        let promise: Promise<any>;
        let p = rest.get(ENDPOINT + ip);
        p.then((response) => {
            promise = Promise.resolve(() => {return response.data["city"]});
        }, (error) => {
            promise = Promise.reject(() => { return error});
        });
        return Promise.resolve(p).then((data)=>promise);
    }
}

这是我的测试代码,它失败了,因为接收到的数据对象是原始的 REST 响应对象

import chai = require('chai');
import {GeoIp} from "../../server/services/GeoIp";
var assert = chai.assert;

describe("GeoIp service", () => {
    let geoIp: GeoIp;
    beforeEach("Initialize service", () => {
        geoIp = new GeoIp();
    });

    var IP_VALID = "137.118.222.187";
    it(`Check geolocation of ${IP_VALID}`, (done) => {
        let promise = geoIp.city(IP_VALID);
        promise.then((data) => {
            console.log(data);
            assert.equal(data, "Traphill");
            done();
        });
    });
});

最佳答案

var rest = require("axios");
const ENDPOINT = "http://freegeoip.net/json/";
@Service()
export class GeoIp {
    city(ip: string): Promise<string> {
        return rest
            .get(ENDPOINT + ip)
            .then((response) => response.data.city);
    }
}

then 方法总是返回另一个 Promise并使 Promises 像那样可链接。

看起来类型签名应该是 Promise<string>

关于javascript - 你如何链接 promise 但将类型从一个然后更改为另一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40559593/

相关文章:

javascript - 如何获取对象的元素?

javascript - 什么方法最适合在 JavaScript 中实例化其他函数的函数?

javascript - 不一致的 jQueryeach() 行为和无法解释的修复

javascript - 将自定义元素添加到 ngRepeat 列表

node.js - JointJS 依赖管理问题

javascript - node.js:在 bluebird 中重新抛出错误时保留堆栈跟踪

javascript - 火狐SDK : redefine content-script function

javascript - 单击 href = "#"的标签时不重定向。 Angular.js

angularjs - 使用 ng-controller 时延迟模板加载

node.js - require ("nodegit") 阻止脚本退出