gpt4 book ai didi

javascript - node.js async.eachSeries 过早调用最终回调

转载 作者:IT老高 更新时间:2023-10-28 12:29:59 26 4
gpt4 key购买 nike

这就是我想要的:我有一个名为 results 的大数组。我想将该数组中的每个项目放入我的迭代函数中并将其保存到我的 mongoDB 中(我在这里也省略了一些不重要的步骤)。在这些项目中的每一项都保存到数据库(或被拒绝)之后,我希望 console.log 显示“全部完成”。不幸的是,在调用系列后几乎立即显示所有完成,而其他一切仍在处理中。我该怎么做?

我将 Mongoose 与一个名为“light”的模型一起使用,为了便于阅读,我省略了代码中的所有错误消息。我对 eachSeries 部分使用 Node 异步

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');
});

最佳答案

(答案,不是评论,因为文字太长了……)

我也在使用异步,你的问题让我很困惑。我尝试了下面的代码,结果更进一步。它对我来说很好。 (异步 0.2.9)。甚至将我的超时延迟更改为 0。

唯一看起来奇怪的是回调之后的 if(entry.length) block 打印控制台信息。如果您收到很多“已经存在”的消息,我可能会看到它们稍后会出现 - 但这听起来不像您所描述的那样。

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

关于javascript - node.js async.eachSeries 过早调用最终回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21728841/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com