多くのプログラミング シナリオでは、複数の非同期データベースを実行する必要があります。ループ内でクエリを実行してデータを取得します。ただし、結果を管理して単一のまとまったデータセットとして返すのは難しい場合があります。
質問で提供されているコードは、実行しようとしていますループ内で複数の MongoDB クエリを実行します。目的は、取得したデータを 1 つの配列に蓄積することです。ただし、このコードでは、結果が予期されたデータではなく「未定義」として返されるという問題が発生します。これは、「return」ステートメントがすべてのクエリの完了を待たずにすぐに実行されるためです。
この問題に対処するには、次のことを行う必要があります。非同期プログラミングの原則を採用します。これらの原則には、Promise の操作と、すべてのクエリが完了した場合にのみ結果が返されるようにする非同期操作の適切な処理が含まれます。
Promises非同期操作の最終的な結果を表します。これらは、「resolve」と「reject」という 2 つのコールバック関数を含むオブジェクトです。操作が正常に完了すると、結果とともに「resolve」が呼び出され、失敗した場合は「reject」が呼び出されます。
このシナリオでは、各データベース クエリは Promise オブジェクトを返す必要があります。これにより、各クエリの完了後に順番に実行されるコールバックのチェーンを作成できます。
コードをリファクタリングして、これらの原則を組み込んでみましょう。 :
var getPrayerCount = function(data2) { var id = data2.id; return find({prayerCat:id}) .then(function(prayer) { if (!prayer) data2.prayersCount = 0; else data2.prayersCount = prayer.length; return data2; }); } var getPrayerInCat = function(data) { var promises = data.map(getPrayerCount); return Q.all(promises); }
「getPrayerCount」では、 「Prayer.find」の代わりに「find」を使用すると、前者は約束を返します。次に、各クエリの結果を処理する '.then' コールバックをチェーンします。
'getPrayerInCat' では、'Q.all' を使用して、個々のクエリすべての完了を表す単一の Promise を作成します。 。これにより、コードは結果を返す前にすべてのクエリが完了するまで待機するようになります。
これらの原則に従うことで、ループ内の非同期データ取得を効果的に処理し、すべてのクエリが完了したときに結果が一貫したデータセットとして返されるようにすることができます。クエリが完了しました。
以上がループ内の非同期データ取得をどのように処理し、一貫したデータセットを返す前にすべてのクエリが完了していることを確認するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。