首頁 > web前端 > js教程 > 如何在 MongoDB 中處理循環內的非同步資料檢索?

如何在 MongoDB 中處理循環內的非同步資料檢索?

Patricia Arquette
發布: 2024-11-09 16:59:02
原創
911 人瀏覽過

How to Handle Asynchronous Data Retrieval within a Loop in MongoDB?

遇到的問題:循環內的非同步資料檢索

在給定的程式碼中,嘗試在循環內從多個MongoDB 查詢檢索資料並組裝結果到單一資料數組中。但是,當嘗試傳回此資料作為回應時,會出現問題。

問題根源

問題源自於 MongoDB 查詢的非同步特性。當執行查詢時,函數不會立即傳回結果,而是啟動任務並立即傳回。這就是為什麼用於儲存聚合結果的 FinalData 以未定義形式傳回:該函數在查詢完成並收集資料之前退出。

解決方案:擁抱 Promises

要解決此問題,我們需要利用 Promise,它透過提供處理非同步任務流程的結構化方法來促進非同步程式設計。 Promise 允許我們定義一個在非同步任務完成時執行的函數。

實作Promise

實作Promise:

  1. 辨識非同步函數: 決定程式碼中的哪些函數是異步的,因為它們需要包裝在Promise 中。在這種情況下,forEach 回呼和 Prayer.find 是異步的。
  2. 包裝非同步函數: 對於本身不傳回 Promise 的函數,建立傳回 Promise 的包裝器。在本例中,我們使用 Q.nbind 將 Prayer.find 包裝在一個承諾回傳函數中。
  3. 鍊式回呼函數: 使用 .then 來鍊式回呼函數,當承諾已解決。在回調函數中,執行任何必要的操作並傳回結果。

最終解

考慮這些概念,修改後的 getPrayerInCat 函數如下:

function getPrayerInCat(data) {
    var promises = data.map(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;
            });
    });
    return Q.all(promises);
}
登入後複製

以上是如何在 MongoDB 中處理循環內的非同步資料檢索?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板