首頁 >web前端 >js教程 >如何處理循環中的非同步資料檢索並確保所有查詢在返回內聚資料集之前完成?

如何處理循環中的非同步資料檢索並確保所有查詢在返回內聚資料集之前完成?

Susan Sarandon
Susan Sarandon原創
2024-11-10 15:54:03512瀏覽

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

循環中的非同步資料擷取:有效處理查詢結果

在許多程式設計場景中,我們都會遇到需要執行多個非同步資料庫的情況會循環查詢以檢索資料。但是,管理結果並將其作為單一內聚資料集傳回可能具有挑戰性。

問題描述

問題中提供的程式碼嘗試執行循環中的多個 MongoDB 查詢,其目標是將檢索到的資料累積到單一陣列中。但是,程式碼遇到一個問題,結果會傳回為“未定義”,而不是包含預期的資料。這是因為「return」語句會立即執行,而不需要等待所有查詢完成。

解決方案概述

要解決這個問題,我們需要擁抱非同步程式設計的原則。這些原則涉及使用 Promise 並正確處理非同步操作,以確保僅在所有查詢完成時才傳回結果。

Promises 和非同步函數

Promises表示非同步操作的最終結果。它們是包含兩個回呼函數的物件:「resolve」和「reject」。當操作成功完成時,將使用結果呼叫“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」中,我們使用「 find”而不是“Prayer.find”,因為前者返回一個承諾。然後,我們連結一個「.then」回呼來處理每個查詢的結果。

在「getPrayerInCat」中,我們使用「Q.all」來建立一個表示所有單一查詢完成的單一 Promise 。這可以確保程式碼在傳回結果之前等待所有查詢完成。

透過遵循這些原則,我們可以有效地處理循環中的非同步資料檢索,並確保當所有查詢都完成時,結果會作為內聚資料集傳回。查詢已完成。

以上是如何處理循環中的非同步資料檢索並確保所有查詢在返回內聚資料集之前完成?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn