質問のタイトル「Promise を次々に (つまり、順番に) 解決しますか?」に基づいて、OP は、順次呼び出し自体よりも決済時の Promise の順次処理に関心があることがわかります。
この回答が提供されています:
- 応答の順次処理に順次呼び出しが必要ないことを示すため。
- このページの訪問者に実行可能な代替パターンを公開します。1 年以上経ってもまだ興味がある場合は、OP を含めます。
- 同時に電話をかけたくないというOPの主張にもかかわらず、これは本当にそうかもしれませんが、タイトルが意味するように応答を順次処理したいという欲求に基づく仮定である可能性もあります。
同時呼び出しが本当に必要ない場合は、順次呼び出し (など) を包括的にカバーする Benjamin Gruenbaum の回答を参照してください。
ただし、(パフォーマンスの向上のために) 同時呼び出しとそれに続く応答の順次処理を可能にするパターンに関心がある場合は、読み進めてください。
Promise.all(arr.map(fn)).then(fn)
(私が何度も行ったように) または Promise lib のファンシー シュガー (特に Bluebird のもの)を使用する必要があると考えたくなるかもしれませんが、(この記事の功績により)arr.map(fn).reduce(fn)
パターンを使用すると、次のような利点があります。
- 任意の promise ライブラリで動作します - jQuery の準拠前のバージョンであっても - のみ
.then()
が使用されます。
- 1 行の mod で、スキップ オーバー エラーまたはストップ オン エラーのいずれかを柔軟に行うことができます。
のために書かれたものですQ
。
var readFiles = function(files) {
return files.map(readFile) //Make calls in parallel.
.reduce(function(sequence, filePromise) {
return sequence.then(function() {
return filePromise;
}).then(function(file) {
//Do stuff with file ... in the correct sequence!
}, function(error) {
console.log(error); //optional
return sequence;//skip-over-error. To stop-on-error, `return error` (jQuery), or `throw error` (Promises/A+).
});
}, Q()).then(function() {
// all done.
});
};
注: その 1 つのフラグメント のみがQ()
Q に固有です。jQuery の場合、readFile() が jQuery promise を返すことを確認する必要があります。A+ ライブラリでは、外国の約束が同化されます。
ここで重要なのは、reduction のsequence
promise です。これは、promise の処理をreadFile
順序付けますが、作成は順序付けません。
.map()
そして、一度それを吸収すると、ステージが実際には必要ないことに気付いたときは、少し気が遠くなるかもしれません! ジョブ全体、並列呼び出しと正しい順序でのシリアル処理は、reduce()
単独で達成でき、さらに次の柔軟性が追加されるという利点があります。
- 1 行移動するだけで、並列非同期呼び出しからシリアル非同期呼び出しに変換できます。開発中に役立つ可能性があります。
ここにありQ
ます。
var readFiles = function(files) {
return files.reduce(function(sequence, f) {
var filePromise = readFile(f);//Make calls in parallel. To call sequentially, move this line down one.
return sequence.then(function() {
return filePromise;
}).then(function(file) {
//Do stuff with file ... in the correct sequence!
}, function(error) {
console.log(error); //optional
return sequence;//Skip over any errors. To stop-on-error, `return error` (jQuery), or `throw error` (Promises/A+).
});
}, Q()).then(function() {
// all done.
});
};
それが基本パターンです。データ (ファイルやその変換など) も呼び出し元に配信したい場合は、軽度のバリアントが必要になります。