ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript Promise を順番に解決するにはどうすればよいですか?

JavaScript Promise を順番に解決するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-13 17:49:15932ブラウズ

How to Resolve JavaScript Promises Sequentially?

Promis を順次解決する

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。