![](/img/trans.png)
[英]How to wait for findOneAndUpdate to finish before continuing async.series
[英]async.series execute callback before finish current
这是结构
var invalid = false;
async.series([
function(callback)
{
someAsync.do(something, function(data)
{
if(data == null) invalid = true;
callback();
}
},
function(callback)
{
if(invalid) callback();
someAsync.doSomethingImportant(something, function(data)
{
if(data == null) invalid = true;
callback();
}
], function()
{
if(invalid) doThis();
else doThat();
});
问题是第一个异步的第二个异步功能NEEDS已成功工作。
有时async.series在语句invalid = true
之前调用callback()并使我的应用程序崩溃。 此外,有时它可以工作。
你可以帮帮我吗?
谢谢!
您的代码看起来正确,但是如果您依赖第一个函数的结果,则可以尝试使用async.waterfall :
async.waterfall([
function(callback)
{
someAsync.do(something, callback);
},
function(data, callback)
{
if(data == null) {
callback(new Error('no data'));
} else {
someAsync.doSomethingImportant(something, callback)
}
},
function (data, callback) {
if (data == null) {
callback(new Error('no data'));
} else {
callback();
}
}
], function(err)
{
if (err) {
doError();
} else {
doThat();
}
});
问题解决了!
我没有使用自己的error control
,而是使用了默认值:
async.series([
function(callback)
{
someAsync.do(something, function(data)
{
if(data == null) callback(true);
else callback();
}
},
function(callback)
{
someAsync.doSomethingImportant(something, function(data)
{
if(data == null) callback(true);
else callback();
}
], function(invalid)
{
if(invalid) doThis();
else doThat();
});
如果传递callback(err)
,它将跳过所有其他异步并执行回调。
代替:
[function a () { async_1(); },
function b () { async_2(); }]
function c () {}
您需要的是
function a () {
async_1(function (data) {
function b (data) {
async_2(function (result) {
function c (success) { console.log(success); }
c(result);
});
}
b(data);
});
}
现在没有种族。
当a完成时,呼叫b;当b完成时,呼叫c。
这真的很难看,因此使用Promises
类的工具将其转换为:
async_1()
.then(async_2())
.then(c);
它可能不是真的是干净的,如果你需要周围传递数据(而不是仅仅等待每一个被finiahed)又将)......但承诺是非常强大的这种工作的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.