我正在使用异步库(浏览器版本)。当我将异步调用嵌套在另一个异步调用中时,我发现异步系列的正常行为(读取“预期”)出现了故障。
以下是一些产生错误输出的小摆设
小提琴1
小提琴2
这里总结了这个问题。
使用下面的代码
$(函数() {
async.series([
function f1(cb) {
setTimeout(function () {
console.log("Hello from f1");
cb(null);
}, 3000);
async.series([
function f11(cb) {
setTimeout(function () {
console.log("Hello from f11");
cb(null);
}, 3000);
}, function f12(cb) {
setTimeout(function () {
console.log("Hello from f12");
cb(null);
}, 3000);
}, function f13(cb) {
setTimeout(function () {
console.log("Hello from f13");
cb(null);
}, 3000);
}], function (err, res) {
console.log("Done all in f1");
});
}, function f2(cb) {
setTimeout(function () {
console.log("Hello from f2");
cb(null);
}, 3000);
}],
function (err, res) {
console.log("Done all");
});});
我预期输出如下
Hello from f1
Hello from f11
Hello from f12
Hello from f13
Done all in f1
Hello from f2
Done all但我得到了这个-
Hello from f1
Hello from f11
Hello from f2
Done all
Hello from f12
Hello from f13
Done all in f1你和我一样认为这个问题吗?我认为async.series会因为同时运行多个异步系列而感到困惑。如果是这样的话,我如何将嵌套的管道输送到主管道中。有人帮我@Caolan
答案由“汤姆”编辑而来。在以下代码更正的代码中早期调用cb(null)是错误的。
$(function () {
async.series([
function f1(cb) {
setTimeout(function () {
console.log("Hello from f1");
}, 3000);
async.series([
function f11(cb1) {
setTimeout(function () {
console.log("Hello from f11");
cb1(null);
}, 3000);
}, function f12(cb1) {
setTimeout(function () {
console.log("Hello from f12");
cb1(null);
}, 3000);
}, function f13(cb1) {
setTimeout(function () {
console.log("Hello from f13");
cb1(null);
}, 3000);
}], function (err, res) {
console.log("Done all in f1");
cb(null);
});
}, function f2(cb) {
setTimeout(function () {
console.log("Hello from f2");
cb(null);
}, 3000);
}],
function (err, res) {
console.log("Done all");
});});
发布于 2014-02-14 10:16:38
对于异步函数,调用回调类似于从正常函数返回,因为它恢复了程序其余部分的执行。在函数f1中,调用cb将导致执行f2 (最终打印Hello from f2和Done all)。
为了确保f2是在f11、f12和f13都完成后执行的,对cb的调用应该移到行console.log("Done all in f1")之后的内部async.series()调用的最后回调。
发布于 2014-02-14 13:42:38
答案由“汤姆”编辑而来。在代码的早期调用cb(null)是一个错误--更正的代码在问题本身中已经被编辑过了。
https://stackoverflow.com/questions/21775894
复制相似问题