2014-11-04 89 views
0

以下代碼 會讀取文件,其中包含按類別排序的文檔以及值desc, ,並修改每個文檔的最高值類別。我們如何知道所有異步操作,所有回調都已完成,並等待它們

下面的代碼:

var MongoClient = require('mongodb').MongoClient; 

MongoClient.connect('mongodb://WRKHAL02:27017/test', function(err, db) { 
if(err) throw err; 

function (cbUpdate(err,updated) { 
    if(err) throw " \n cbUpdate \n" + err; 
    console.log(" Successfully updated " + updated + " Document"); 
} 

var theFile = db.collection("theFile"); 
var cursor = theFile.find({}); 

cursor.sort([["State",1],["Temperature",-1]]); 

currentState = "empty"; 
cursor.each(function(err,doc) { 
    if(err) throw " \n -*- cursor.each error -*- \n" + err; 
    if (doc == null) { 
     console.log(" \n doc == null ; End Of File \n "); 
     here use to be the db.close(); 
    } 
    else { 
     if (currentState != doc.State) { 
      console.log(doc._id); 
      console.log(doc.State); 
      console.log(doc.Temperature); 
      var myquery = {}; 
      myquery['_id'] = doc['_id']; 
      var myupdate = {$set:{"month_high":true}}; 
      theFile.update(myquery, myupdate, cbUpdate); 
      currentState = doc.State; 
     } 
    } 
}); 

setTimeout(function() { 
    console.log(" TimeOut "); 
    db.close(); 
}, 3000); 
}); 

問題是,當所有異步操作都結束了,我不知道。 讀取過程可以先完成,或者更新過程可以先完成(如果在上次更新後有多個文檔需要讀取)。 所以我不知道何時關閉數據庫。

我如何知道所有異步操作和所有回調都已完成,並等待它們。 我讀到了關於「承諾」的內容,但是看起來像是用地獄來寫一些高效而乾淨的東西。

我發現測試這一小段代碼的唯一但不現實的方法是在最後添加一個等待循環。

異步功能似乎將一個非常簡單的算法變成了一些深度困惑。

謝謝。

+0

有一個計數器初始化用零,在調用'.update()'之前增加它,並在更新回調中遞減。零計數器==完成所有異步操作。 – 2014-11-04 22:59:03

+0

使用promises或'async'模塊。 – SLaks 2014-11-05 15:13:41

回答

1

我想說你在window.open_procs = 0;中設置一個全局變量,然後在每次調用ajax調用開始時增加它,然後在每個ajax調用結果中執行的函數中減少它。

在您啓動最後的ajax調用之後,啓動您的watcher進程,超時時間會在執行任何操作之前檢查window.open_procs等於0。