Promise は、JavaScript で非同期操作を処理する一般的な方法です。ただし、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 with the first file! }); };
このコードは再帰を使用してファイルを次々に読み取りますが、作業が難しい場合がありますwith.
Async/Await による再帰の回避:
最新の JavaScript では、async 関数と await を使用する方がより洗練された解決策です:
async function readFiles(files) { for(const file of files) { await readFile(file); } };
または、次のように使用します。イテレーター:
非同期ジェネレーターは、ファイルを順番に読み取る代替アプローチを提供します:
async function* readFiles(files) { for(const file of files) { yield await readFile(file); } };
単純なループを検討してください:
より単純なアプローチを好む場合は、基本的な for ループを使用できます。 suffice:
var readFiles = function(files) { var p = Promise.resolve(); // Q() in q files.forEach(file => p = p.then(() => readFile(file)); ); return p; };
または、Promise Reduction を使用します:
reduce を使用したよりコンパクトなソリューション:
var readFiles = function(files) { return files.reduce((p, file) => { return p.then(() => readFile(file)); }, Promise.resolve()); // initial };
ライブラリ ユーティリティメソッド
ある約束ライブラリ (例: Bluebird) は、この目的に合わせたユーティリティ メソッドを提供します:
var Promise = require("bluebird"); var fs = Promise.promisifyAll(require("fs")); var readAll = Promise.resolve(files).map(fs.readFileAsync,{concurrency: 1 }); // if the order matters, you can use Promise.each instead and omit concurrency param readAll.then(function(allFileContents){ // do stuff to read files. });
以上がJavaScript Promise を順番に解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。