2016-06-28 19 views
-1

タイトルが混乱しています。申し訳ありません。別の約束を約束する方法

次の約束のために約束の内容を見る必要があります。

コンテキストのための私の以前のスレッドを参照してください:私は以下のコードを働いている、と私は私の問題を注釈付きHow to sequentially handle asynchronous results from API?

を:

var promises = []; 

    while (count) { 
     var promise = rp(options); 
     promises.push(promise); 
     // BEFORE NEXT PROMISE, I NEED TO GET ID OF AN ELEMENT IN THIS PROMISE'S DATA 
     // AND THEN CHANGE 'OPTIONS' 
    } 

    Promise.all(promises).then(values => { 
     for (var i = 0; i < values; i++) { 
      for (var j = 0; j < values[i].length; j++) { 
       results.push(values[i][j].text); 
      } 
     } 
     return res.json(results); 
    }, function(reason) { 
     trace(reason); 
     return res.send('Error'); 
    }); 
+0

'答えを受け入れることは重要であり、あなたはそれ – Oxi

+0

で何もしていない私はまだでした問題を解決する過程で、迅速なフォローアップの質問がありました。私は答えを受け入れるように思い出させてくれてありがとう。 @Oxi –

答えて

0

これは約束は、結果ので、連鎖させることができる方法の完璧な例ですthenの新しい約束です。

while (count) { 
    var promise = rp(options); 
    promises.push(promise.then(function(result) { 
     result.options = modify(result.options); // as needed 
     return result.options; 
    }); 
} 

このようにして、Promise.allに与えられた各約束を前処理することができます。

0

約束が別の約束に依存している場合(前者が完了してデータを提供するまで実行できないなど)、約束を結ぶ必要があります。 「いくらかのデータを得るという約束に達すること」はありません。その結果を望むなら、.then()でそれを待つ。

rp(options).then(function(data) { 
    // only here is the data from the first promise available 
    // that you can then launch the next promise operation using it 
}); 

あなたはこのシーケンスに(あなたのコードが意味するものである)count回をしようとしている場合は、ラッパー関数を作成することができますし、カウントが到達するまで、各約束が完了してから自分自身を呼び出します。それ両方があなたの問題を解決するためのポスターを報酬とあなたの問題は、私は、コンテキストのためのあなたのスレッドをチェックしresolved.`がある他の人に知らせるよう

function run(iterations) { 
    var count = 0; 
    var options = {...}; // set up first options 
    var results = [];  // accumulate results here 

    function next() { 
      return rp(options).then(function(data) { 
       ++count; 
       if (count < iterations) { 
        // add anything to the results array here 
        // modify options here for the next run 
        // do next iteration 
        return next(); 
       } else { 
        // done with iterations 
        // return any accumulated results here to become 
        // the final resolved value of the original promise 
       } 
      }); 
    } 
    return next(); 
} 

// sample usage 
run(10).then(function(results) { 
     // process results here 
}, function(err) { 
     // process error here 
}); 
+0

@MelvinLu - これで問題が解決したのか、それともあなたの質問に答えましたか? – jfriend00