2016-11-12 15 views
2

私はnodejs/typescript /約束を比較的新しくしていますので、私は約束を守る正しい方法が不明です。約束事をどのように結びつけるのですか?

私はIPに基づいてジオロケーションをフェッチするためにREST APIを呼び出すヘルパークラスを持っています。私は全体の反応には興味がなく、都市のフィールドだけに興味があります。解決したら街のフィールドだけを取得するという約束を正しく返すにはどうすればいいですか?ここ

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それのような連鎖可能なことを約束する。

タイプシグニチャが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); 
 
    } 
 
}

関連する問題