2016-05-31 12 views
2

私は、ECMAScript 6の約束が非同期関数の同期コーディングを可能にしていることを実感しています。約束しているすべてのコードに対して、同期的な結果があります。例えば:"while"ループを約束しますか?

var data = processData(JSON.parse(readFile(getFileName()))); 

は同じです:

var data = getFileName() 
    .then(readFile) 
    .then(JSON.parse) 
    .then(processData); 

は今、私の現在のユースケースのために、私は大規模な公共のAPIからデータを取得するコードを記述します。純粋に、同期の世界で、私は次のようなものを書きますので、APIは、ページ分割です:

var data = []; 
var offset = 0; 
var total = 10000; // For example - not actually how this would work 
while(offset < total) { 
    data.concat(getDataFromAPI(offset)); 
    offset = data.length; 
} 

は今、私の質問は、私は約束でこれを行うだろうか、でしょうか?私のような何か書くことができます:

var data = []; 
var offset = 0; 
var total = 10000; 
getDataFromAPI(offset) 
    .then(function(newData){ 
     data.concat(newData); 
     return getDataFromAPI(data.length); 
    }); 

をしかし、この時点で私はちょうど無限.then Sをチェーンに強制しています - 何のループのロジックはありません。私は再帰を使って何かが可能であるべきだと思っていますが、どうやってそれをするのか分かりません。

私は約束のライブラリとしてBluebirdJSを使用しています。そのため、すべてのヘルパーメソッドにアクセスできます。私は何かのように感じる

+0

:それ以外の場合は、最終的な結果を返しますか?ここには例があります:https://jsfiddle.net/f5ud8ytx/。あなた自身のapi呼び出しでタイムアウトを置き換え、api呼び出しから返された約束を.thenして、関数が最後に0に達するまで関数を呼び出します(current-終了まで0まで実行します) – briosheje

+0

これは '非同期 - 各 ' – r3wt

答えて

6

正確に再帰を使用可能にする必要があります。コールバックに名前を付けて、再度参照できるようにすることができます。条件が満たされない限り、コールバックから約束を返します。どのような(最終的に約束と組み合わせる)再帰的自己呼び出す無名関数についての代わりに

getDataFromAPI(offset) 
    .then(function next(newData){ 
    data.concat(newData); 
    var newOffset = data.length; 
    return newOffset < total ? getDataFromAPI(newOffset).then(next) : data; 
    }) 
    .then(function(data) { 
    console.log(data); // final result 
    }); 
関連する問題