您提出問題的方式非常具有誤導性。所有你想知道的是「什麼時候加工完成,我可以關閉?」。
答案是,您需要尊重回調,一般情況下只需在每次更新完成後通過結果光標進行移動。
最簡單的方法沒有其他依賴是使用由駕駛員支載的stream interface:
var MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb://localhost:27017/data',function(err,db){
if(err) throw err;
coll = db.collection('weather');
console.log('connection established')
var stream = coll.find().sort([['State',1],['Temperature',-1]])
stream.on('err',function(err) {
throw err;
});
stream.on('end',function() {
db.close();
});
var month_highs = [];
var state = '';
var length = 0;
stream.on('data',function(doc) {
stream.pause(); // pause processing documents
if (err) throw err;
if (doc) {
length = month_highs.length
if(state != doc['State']){
month_highs.push(doc['State']);
//console.log(doc);
}
state = doc['State']
if(month_highs.length > length){
coll.update(doc, {$set : {'month_high':true} }, function(err, updated){
if (err) throw err;
console.log(updated)
stream.resume(); // resume processing documents
});
} else {
stream.resume();
}
} else {
stream.resume();
}
});
});
這只是一個代碼的副本,從您的回購,重構使用流。所以所有重要的部分都是「流」這個詞出現的地方,最重要的是它們被稱爲的地方。
簡而言之,「數據」事件由遊標結果中的每個文檔發出。首先您撥打.pause()
,以便新文檔不會超出處理範圍。然後你做你的.update()
,並在它的回調中返回你呼叫.resume()
,流程繼續下一個文檔。
當光標用完時,會發出最終「結束」,那就是您撥打db.close()
的地方。
這是基本的流量控制。對於其他方法,請看node async庫作爲一個好幫手。但是不要使用異步控制循環數組,並且不要使用.each()
,這是DEPRECATED。
您需要在.update()
回調完成後發出信號,以便無論如何都要遵循新的「循環迭代」。這是基本沒有額外的依賴性方法。
P.S我有點懷疑你的代碼的一般邏輯,特別是當你閱讀它的時候測試的東西的長度是否更大,而不會改變那個長度。但這是關於如何實現「流量控制」,而不是修復代碼中的邏輯。
我該如何改進測試邏輯?每次將新項目添加到陣列時,我都想添加該項目,以及如何說明它。看看上面的代碼拋出的錯誤https://github.com/DiegoGallegos4/Mongo/blob/master/error.rtf。我的mongo版本是3.0.5,如果這可以幫助你。 –
@DiegoGallegos真的不知道你真的想在這裏做什麼,所以也許你應該在另一個問題上充分地問。你的問題基本上是關於「流量控制」,並告知每次更新和所有更新是否完成(儘管你可能已經有更多的重點了)。如果您有其他問題,請[提出新問題](http://stackoverflow.com/questions/ask)。我們只能真正回答所問的問題,並且更清楚地將你的「問題」分開。 –