2016-05-18 16 views
1

私はノードのライブラリを使って簡単なhttpリクエストを行い、約束を返します。これはいくつかの並列化を可能にするのでうまくいきます。後でPromise.all()で収集します。しかし、httpリクエストは文字列を返すだけであり、各リクエストについての追加の識別情報を知る必要があります。だから私はこれを行う一つの方法は、要求の約束から何かを取り除き、その情報を追加することでしたが、これは私が後で収集する予定の配列に追加されているそのような要求を示しているコードです:約束の結果に余計なデータを追加する

var promises = []; 
promises.push(new Promise(function(resolve, reject){ 
    ReqPromise('http://some.domain.com/getresult.php') 
    .then(function(reqResult) { 
     resolve({ 
      source: 'identifier', 
      value: reqResult 
     }); 
    }); 
})); 

そして、これは、それが解決するとき、私はこの約束のために戻って得るものです:

{ 
    source: 'identifier' 
    value: 1.2.3.4 
} 

これは理想的な方法への「タグ」の約束の結果ですか?それとも、私が誤解している約束事について何かがあります。これは、上記のように余分な約束をする必要はないということですか? ReqPromiseは外部ライブラリにありますので、余分なパラメータを取得して返すことは難しいことに注意してください。

+0

OKは、質問1を無視してください、私は一度に気づい「約束」に1つ以上のものを押し込む。私の悪い。質問2はまだ立っています - これが望ましい結果を達成する最良の方法ですか? – dsl101

+2

['Promise'コンストラクタの反パターンを避ける](http://stackoverflow.com/q/23803743/1048572)! – Bergi

+0

あなたの質問を編集する方法を示すか、投稿から最初の質問を削除するかのどちらかの質問を[編集]してください。 – Bergi

答えて

2

リンクのために@Bergiに感謝します。これは私が結んできたコードですが、私はそれがずっときれいだと同意します。私は前にこのようなことを試みましたが、それはPromise.all()に未定義に戻っていたので、間違いがあったにちがいありません。しかし今は特別な約束なしでうまくいきます。 DSL101 @

promises.push(ReqPromise('http://some.domain.com/getresult.php').then(function(reqResult) { 
    return { 
     source: 'identifier', 
     value: reqResult 
    }; 
})); 
0

、さらに一歩、あなた自身の答えよりも起こって、それは約束の配列にデータの配列.map()に役立つことができ、その対応する非同期由来結果と各データ項目を関連付けます。

たとえば、URLから始めることができます。私は解決の約束を扱うループ_inside_結果を印刷していたと思ったが、私はありませんでし判明し、これは全体の配列だった - -

var data = ['http://path/0', 'http://path/1', 'http://path/2', ...]; 
var promises = data.map(function(url) { 
    return ReqPromise(url).then(function(reqResult) { 
     return { 
      'source': url, 
      'value': reqResult 
     }; 
    }); 
}); 
Promise.all(promises).then(function(results) { 
    // each result has a .value and a corresponding .source (url) property 
}); 
+0

ニース。実際、私の場合、約束は同質ではありませんが、これは良い解決策です。 – dsl101

+0

あなたのバックポケットに入れておくのは1つ。 –

関連する問題