Javascript 您如何将承诺链接起来,但将类型从一种更改为另一种?

Javascript 您如何将承诺链接起来,但将类型从一种更改为另一种?,javascript,angularjs,node.js,typescript,promise,Javascript,Angularjs,Node.js,Typescript,Promise,我对nodejs/typescript/promissions比较陌生,所以我不确定链接承诺的正确方法 我有一个助手类,它调用RESTAPI来获取基于ip的地理位置。我对整个回答不感兴趣,只对城市领域感兴趣。我如何正确地返回一个承诺,即解决后仅获取城市字段 var rest = require("axios"); const ENDPOINT = "http://freegeoip.net/json/"; @Service() export class GeoIp { city(ip:

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

我有一个助手类,它调用RESTAPI来获取基于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);
    }
}
var rest=require(“axios”);
常量端点=”http://freegeoip.net/json/";
@服务()
导出类GeoIp{
城市(ip:string):承诺{
返回rest.get(ENDPOINT+ip),然后((res)=>res.data.city);
}
}
var rest=require(“axios”);
常量端点=”http://freegeoip.net/json/";
@服务()
导出类GeoIp{
城市(ip:string):承诺{
回程休息
.get(端点+ip)
.然后((响应)=>response.data.city);
}
}
该方法总是返回另一个
Promise
,并使Promises链能够像这样运行


看起来类型签名也应该是
Promise

如答案所示,无需创建自己的Promise。事实上,这样做是一种挑战
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);
    }
}