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

Posted

技术标签:

【中文标题】您如何链接承诺但将类型从一种更改为另一种?【英文标题】:How do you chain promises but change type from one then to another? 【发布时间】: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 【参考方案1】:
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&lt;string&gt;

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于您如何链接承诺但将类型从一种更改为另一种?的主要内容,如果未能解决你的问题,请参考以下文章

将一种视图更改为另一种视图

C 强制类型转换

状态单子:从一种状态类型转换到另一种状态类型

Oracle PL/SQL 和 Shell 脚本:从一种模式到另一种模式

向量从一种类型到另一种c ++的隐式转换

C语言强制类型转换