[英]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.map
或lodash.each
使用閉包,這樣就不必單獨創建一個。
閉包函數在循環內部的經典錯誤。
您的變量值會在每個循環步驟中更改。 另一方面,當變量已多次更改時,您的函數將稍后(一段時間后)執行。
查看鏈接以進行澄清:
完善!
謝謝提醒伙計。 我使用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.