2016-10-19 16 views
-1

連鎖した約束からデータを解決して返す方法に問題があります。私は、ノードjsを使用しています。要求約束です。ここに私のコードはループ内で約束を解決する

start(name) 
    .then(firstFunction) 
    .then(secondFuntion) 
    .then(function(){ 
     // i want to return data from secondfunction back 
    )) 

ある問題は私がオブジェクトの配列であるfirstFunction、から得た各オブジェクトの呼び出しを実行するループを持つsecondFunctionです。各反復の後、またはすべての反復の後に約束を解決しますか?グローバルオブジェクトを作成してその結果を保存し、その結果を返す方が賢明でしょうか? secondFunctionのための私のコードは、私はそれを考え出したこの

var secondFunction = function(data){ 
    var promise = new Promise(function(){ 
     for(var i= 0; i <data.length; i ++){ 
      options = { url: "", jason: true} 
      rp.(options) 
       .then(function(resp){ 
       // i do something with respose and need to save this 
       //should i resolve the promise here?? 
       }) 
       .catch(function(err){ 
       }); 
     } 
    }); 
    return promise; 
} 

EDIT

のように見えます!おかげですべての助けのために、私の第二の機能では、私はあなたがして、配列内の各アイテムの非同期アクションを実行するための通常のパターンは、約束を返す関数にアクションを作ることです。この

var task = function(item){ 
    // performed the task in here 
} 

var actions = data.map(task); 
return Promise.all(actions); 

答えて

0

をしました[].map()を使用して値の配列をPromisesの配列にマップします。 Promise.all()を使用すると、約束事の配列を受け取り、元の配列のすべての約束が解決されたときに、値の配列で解決される単一の約束事を返します。それは次のようになります。

var secondFunction = function(data) { 
    var promisesArray = data.map(rp); 
    return Promise.all(promisesArray); 
} 

あなたの第三.then()彼らはdataに登場順に、data中の各項目にrpの適用から解決値の配列を持つことになります。

一部ES6砂糖と短いバージョンです:

const secondFunction = data => Promise.all(data.map(rp)); 

あなたは、サーバー側のJSのための事実上の約束のライブラリであるブルーバードを、使用している場合は、速記を使用することができ、Promise.map()、どの配列とマッピング関数を受け入れ、同じことをします:

const secondFunction = data => Promise.map(data, rp); 
+0

ありがとう!私はあなたの提案を使用した – inhaler

関連する問題