簡體   English   中英

貓鼬find()與回調有關的問題

[英]Mongoose find() issues with callbacks

我找不到使我的查找功能正常工作的方法。 我想從bills集合中找到所有billIds,然后檢查交易數據庫中的每個billId。

問題是,由於aSynch-我認為ID在我的循環中沒有更新。 這是代碼:

Bills.find({type: bill_type, endDate: {"$gte" : new Date(year + "-" + month + "-1")}}).find(function(err, bills){
        if(err)
            res.send(err);

        details.bills = bills;

        for(key in bills){
            var billId = bills[key]._id;
            console.log("BillId: " + billId); // Here the ids are unique (which is what I want)

             Transactions.find({billId : billId}, function(err, transactions){
                if (err) {
                    console.log('error: '+ err)
                } else {
                    console.log("Transaction BillId: " + billId); // Here I get always the same ID - which is not quiet what I need.
                }
            });


            //console.log(transactions);
        }

       res.send(details);  
    });

控制台上的結果是:

BillId: 549bf0597886c3763e000001
BillId: 54a014bfac01ca3526000001
BillId: 54a015753547a6c026000001

^好結果-來自for()中的第一個console.log。

接着:

Transaction BillId: 54a015753547a6c026000001
Transaction BillId: 54a015753547a6c026000001
Transaction BillId: 54a015753547a6c026000001

^不好的結果-它重復了for()的最后一個結果,我需要所有結果。

在第一次的console.log(),當我從第一個找到結果()( Bills.find()我可以看到在日志中的所有的ID,但是當我試圖讓他們的第二查找(內部Transactions.find() ),它們重復最后一個ID。 因此,在當前狀態下,我無法為每個ID查詢數據庫。 在這方面的任何幫助表示贊賞。

如果需要任何說明,請告訴我。

提前致謝!

如果您的Transactions.find函數是異步的,則它的回調將在for ... in周期結束后很長時間運行。 那時, billId具有在for ... in周期的最后一次運行中分配的值。 因此,所有的回調運行都會打印出該值。

如果要保留該值,則必須在某處創建一個閉包 ,如下所示:

(function (id) {
    Transactions.find(..., function (...) {
        // ... use `id` here
    });
})(billId);

如果bills是一個Array或者您正在使用某個實用程序庫(例如Lo-Dash) ,則可以使用迭代函數(例如Array.prototype.maplodash.each使用閉包,這樣就不必單獨創建一個。

閉包函數在循環內部的經典錯誤。

您的變量值會在每個循環步驟中更改。 另一方面,當變量已多次更改時,您的函數將稍后(一段時間后)執行。

查看鏈接以進行澄清:

在循環中創建閉包:一個常見錯誤

循環內的JavaScript閉合–簡單的實際示例

JavaScript臭名昭著的循環問題?

完善!

謝謝提醒伙計。 我使用Underscore解決了每個函數

方法如下:我沒有使用for循環,而是簡單地用_.each替換了for,如以下示例所示:

Bills.find({type: bill_type, endDate: {"$gte" : new Date(year + "-" + month + "-1")}}).find(function(err, bills){
    if(err)
        res.send(err);

    details.bills = bills;

    _.each(bills, function(item){        
        var billId = item._id; 
        console.log("BillId: " + billId); 

         Transactions.find({billId : billId}, function(err, transactions){
            if (err) {
                console.log('error: '+ err)
            } else {
                console.log("Transaction BillId: " + billId);
            }
        });


        //console.log(transactions);
    });

   res.send(details);  
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM