2014-02-12 50 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