【发布时间】:2017-03-26 08:52:12
【问题描述】:
我对 nodejs/typescript/promises 比较陌生,所以我不确定链接 promise 的正确方法。
我有一个助手类,它调用 REST api 来获取基于 ip 的地理位置。我对整个响应不感兴趣,只对城市字段感兴趣。我如何正确返回一个承诺,当解决时只获得城市字段?
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();
});
});
});
【问题讨论】:
-
如答案所示,无需创建自己的承诺。确实,这样做是anti-pattern
标签: javascript angularjs node.js typescript promise