ループ内の非同期データ取得をどのように処理し、一貫したデータセットを返す前にすべてのクエリが完了していることを確認するにはどうすればよいでしょうか?

Susan Sarandon
リリース: 2024-11-10 15:54:03
オリジナル
462 人が閲覧しました

How do you handle asynchronous data retrieval in loops and ensure all queries complete before returning a cohesive dataset?

ループでの非同期データ取得: クエリ結果の効果的な処理

多くのプログラミング シナリオでは、複数の非同期データベースを実行する必要があります。ループ内でクエリを実行してデータを取得します。ただし、結果を管理して単一のまとまったデータセットとして返すのは難しい場合があります。

問題の説明

質問で提供されているコードは、実行しようとしていますループ内で複数の MongoDB クエリを実行します。目的は、取得したデータを 1 つの配列に蓄積することです。ただし、このコードでは、結果が予期されたデータではなく「未定義」として返されるという問題が発生します。これは、「return」ステートメントがすべてのクエリの完了を待たずにすぐに実行されるためです。

ソリューションの概要

この問題に対処するには、次のことを行う必要があります。非同期プログラミングの原則を採用します。これらの原則には、Promise の操作と、すべてのクエリが完了した場合にのみ結果が返されるようにする非同期操作の適切な処理が含まれます。

Promises と Async Functions

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート