この詳細な記事では、一連の 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]; } }
アプローチ 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 サイトの他の関連記事を参照してください。