2014-02-12 47 views
5

這就是我想要的:我有一個稱爲結果的大型數組。該數組中的每一項我都想放在我的迭代函數中,並將它保存到我的mongoDB中(我省略了一些步驟以及哪些不重要)。在這些項目中的每一個都被保存到數據庫(或拒絕)後,我想console.log顯示「全部完成」。不幸的是,在調用系列後幾乎立即顯示所有完成,而其他所有內容仍在處理中。我該如何做到這一點?node.js async.eachSeries調用最終回調太早

我正在使用名爲'light'的模型使用貓鼬,爲了便於閱讀,我省略了代碼中的所有err消息。我使用節點異步的eachSeries部分

var async = require('async');  
var results = [very big array] 
var iteration = function(row,callbackDone) { 
    light.find({data: row.data}, function (err,entry) { 
    if(entry.length) { 
     callbackDone(); 
     return console.log(entry + ' already exists'); 
    } 
    var newEntry = new light(row); 
    newEntry.save(function (err,doc) { 
     console.log(entry + ' saved'); 
     callbackDone(); 
    }); 
    }); 
}; 

async.eachSeries(results,iteration, function (err) { 
    console.log('All done'); 
}); 
+1

嘗試添加一些錯誤記錄器('如果(ERR)的console.log(ERR);')。 – maxdec

+0

爲了便於閱讀,我刪除了錯誤記錄器。對不起,如果我不清楚。該陣列容易擁有超過100個條目,貓鼬操作完美無瑕,但是在console.log('全部完成')已被顯示之後保存全部發生。我需要的是一種在我的數組中的所有項目都已經處理完畢後顯示'全部完成'的方法 – elmalto

回答

4

(一個答案,而不是評論,因爲文本太長...)

我使用的是異步的東西太多,你的問題不解我。我嘗試了下面的代碼,將結果進一步降低。它爲我工作得很好。 (異步0.2.9)。即使將我的超時延遲更改爲0.

唯一看起來很奇怪的是if(entry.length)塊在回調後打印的控制檯信息。如果你收到了很多「已經存在」的消息,我可能會看到他們可能會晚點 - 但這聽起來不像你所描述的那樣。

var async = require('async'); 
var console = require('console'); 
var results = [ ]; 
results.push({id:1,data:'a'}); 
results.push({id:2,data:'b'}); 
results.push({id:3,data:'c'}); 
results.push({id:4,data:'d'}); 

function doFind(obj, callback) { 
    setTimeout(function() { 
    console.log("finding id=" + obj.data.id); 
    obj.data.length = obj.data.id % 2; 
    callback(null, obj.data); 
    }, 500); 
} 

function light(obj) { 
    this.id = obj.id; 
    this.data = obj.data; 
    this.save = function(callback) { 
    setTimeout(function() { 
     console.log("saving id=" + obj.id); 
     callback(null, this); 
    }, 500); 
    }; 
} 

var iteration = function(row,callbackDone) { 
    doFind({data: row}, function (err,entry) { 
    if(entry.length) { 
     callbackDone(); 
     return console.log('id=' + entry.id + ' already exists'); 
    } 
    var newEntry = new light(row); 
    newEntry.save(function (err,doc) { 
     console.log('id=' + entry.id + ' saved'); 
     callbackDone(); 
    }); 
    }); 
}; 

async.eachSeries(results, iteration, function (err) { 
    console.log('All done'); 
}); 

結果

finding id=1 
id=1 already exists 
finding id=2 
saving id=2 
id=2 saved 
finding id=3 
id=3 already exists 
finding id=4 
saving id=4 
id=4 saved 
All done 
+0

您的示例對我來說也很完美,出於某種原因,我無法解決自己的問題。我切換到 var stream = light.find({})。stream(); 解決方案並暫停流,直到異步響應來臨。可能有點醜陋,但它適用於我。非常感謝您的意見! – elmalto