这是结构
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()并崩溃我的应用程序。此外,有时它也有效。
你能帮帮我吗?
谢谢!
答案 0 :(得分:0)
您的代码看起来是正确的,但如果您依赖第一个函数的结果,则可以尝试使用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();
}
});
答案 1 :(得分:0)
问题解决了!
我没有使用我自己的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)
,它将跳过所有其他异步并执行回调。
答案 2 :(得分:-1)
而不是:
[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);
});
}
现在没有种族。
完成后,拨打b,当b结束时,拨打c。
这可能会变得非常难看,因此Promises
等工具会将其变为:
async_1()
.then(async_2())
.then(c);
如果你需要传递数据(而不仅仅是等待每一个被完成),它可能不是 干净的......,但承诺是非常的这种工作有力。