2016-11-12 37 views
2

我對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(); 
     }); 
    }); 
}); 
+0

如答案中所示,沒有必要創建自己的承諾。事實上,這樣做是[反模式](https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns#the-deferred-anti-pattern) – cartant

回答

2
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和mak es Promises可以像這樣連鎖。

看起來類型簽名應該也是Promise<string>

+0

我認爲這將是一個更好的答案,如果你沒有吞下這個錯誤。 – cartant

+1

謝謝,我會修改我的答案 –

+0

完美的作品。最後更好地理解承諾。我已經接受了這個答案,因爲額外的解釋和額外的Promise 提示。謝謝! – Pierre

3

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); 
 
    } 
 
}

相關問題