ファイルの配列をシリアル/シーケンシャルに読み取る次のコードを考えてみます。readFiles
すべてのファイルが順番に読み込まれたときにのみ解決されるpromiseを返します。
var readFile = function(file) {
... // Returns a promise.
};
var readFiles = function(files) {
return new Promise((resolve, reject) =>
var readSequential = function(index) {
if (index >= files.length) {
resolve();
} else {
readFile(files[index]).then(function() {
readSequential(index + 1);
}).catch(reject);
}
};
readSequential(0); // Start!
});
};
上記のコードは機能しますが、物事が連続して発生するために再帰を実行する必要はありません。奇妙なreadSequential
関数を使用する必要がないように、このコードを簡単に書き直す方法はありますか?
元々はを使用しようとしましたPromise.all
が、それによりすべてのreadFile
呼び出しが同時に発生しましたが、これは私が望んでいることではありません。
var readFiles = function(files) {
return Promise.all(files.map(function(file) {
return readFile(file);
}));
};
readFileSequential()
次のものが呼び出される前に、すでに(それは非同期だから、それは元の関数の呼び出しが既に返された後も長く完了)戻ってきました。