Promise チェーンを使用した同期ループの作成方法
問題:
ループの構築Promise 呼び出しと後続のログ ステートメントの同期実行が困難になる可能性があります。これは、Bluebird などのライブラリを使用する場合に特に当てはまります。
解決策 1 (簡略化されたpromisewhile 関数):
<code class="javascript">var Promise = require('bluebird'); var promiseWhile = function(condition, action) { var resolver = Promise.defer(); var loop = function() { if (!condition()) return resolver.resolve(); return Promise.cast(action()) .then(loop) .catch(resolver.reject); }; loop(); return resolver.promise; };</code>
この簡素化されたバージョンのpromisewhile 関数では、コールバックを次のように渡す必要があります。
解決策 2 (配列削減の使用):
別のアプローチは、電子メール アドレスの配列を削減し、対応する非同期を作成することです。それぞれの呼び出し:
<code class="javascript">function fetchUserDetails(arr) { return arr.reduce(function(promise, email) { return promise.then(function() { return db.getUser(email).done(function(res) { logger.log(res); }); }); }, Promise.resolve()); }</code>
このアプローチはフラットな .then() チェーンを作成し、応答の元の順序を維持します。
使用法:
fetchUserDetails の呼び出しは電子メール アドレスの配列を受け取ります:
<code class="javascript">fetchUserDetails(arrayOfEmailAddys).then(function() { console.log('all done'); });</code>
このアプローチでは、外部のカウンターや条件関数が必要なくなります。制限は電子メール配列の長さによって決まります。
以上が提供された記事に適合する質問形式のタイトルをいくつか示します。 * Promise チェーンを使用して同期実行を実現する方法: 簡略化された `promisewhile` および配列削減テクニックのガイド *Sの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。