ホームページ  >  記事  >  ウェブフロントエンド  >  Promise を順番に実行する方法: 同期テクニックの包括的なガイド

Promise を順番に実行する方法: 同期テクニックの包括的なガイド

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-08 21:41:02982ブラウズ

How to Execute Promises in Sequence: A Comprehensive Guide to Synchronization Techniques

一連の Promise を同期する方法

この詳細な記事では、一連の Promise を同期し、それらが確実に解決されるようにするための包括的なテクニックを提供します。

問題

次の配列があります。次々に解決する必要がある Promise オブジェクト ([p1、p2、p3、...])。後続の Promise を解決するには、前の Promise が完了する必要があります。さらに、シーケンス内のいずれかの Promise が拒否された場合は、それ以上 Promise を解決しようとせずに、チェーン全体を拒否する必要があります。

ソリューションの概要

手動での反復から、 Promise.map() や async/await などの Promise ライブラリ機能を活用します。各アプローチでは、その実装を明確に説明し、実践的な例を示します。

手動反復

アプローチ 1: While ループの使用

function sequence(arr) {
  let i = 0;

  const next = () => {
    if (i < arr.length) {
      arr[i++].then(next);
    }
  };
  next();
}

アプローチ 2: For を使用するループ

function sequence(arr) {
  for (let i = 0; i < arr.length; i++) {
    await arr[i];
  }
}

Promise ライブラリ ソリューション

アプローチ 3: Promise.mapSeries (Bluebird.js) の使用

Promise.mapSeries(arr, (p) => p).then((results) => {
  // Process final results
});

アプローチ 4: Promise.mapSeries を遅延して使用する(Bluebird.js)

Promise.mapSeries(arr, (p) => delay(t, p)).then((results) => {
  // Process final results
});

function delay(t, v) {
  return new Promise((resolve) => {
    setTimeout(resolve.bind(null, v), t);
  });
}

非同期/待機ソリューション

async function sequence(arr) {
  const results = [];
  for (let i = 0; i < arr.length; i++) {
    results.push(await arr[i]);
  }
  return results;
}

警告: 拒否の処理

これらのソリューションでは、次のことに注意することが重要です。シーケンス内の約束は拒否され、チェーン全体が中断され、拒否が伝播します。拒否を別の方法で処理したい場合、またはプロセスをさらに制御したい場合は、特定の要件に合わせてコードを変更する必要があります。

結論

シーケンスを同期するためのいくつかのアプローチを検討してきました。を約束し、手動とライブラリベースの両方のソリューションを提供します。どのアプローチを選択するかは、特定の要件とアプリケーションのコンテキストによって異なります。

以上がPromise を順番に実行する方法: 同期テクニックの包括的なガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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