私は、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を使用しています。そのため、すべてのヘルパーメソッドにアクセスできます。私は何かのように感じる
:それ以外の場合は、最終的な結果を返しますか?ここには例があります:https://jsfiddle.net/f5ud8ytx/。あなた自身のapi呼び出しでタイムアウトを置き換え、api呼び出しから返された約束を.thenして、関数が最後に0に達するまで関数を呼び出します(current-終了まで0まで実行します) – briosheje
これは '非同期 - 各 ' – r3wt