Nodejs async each inside each inside 瀑布
Nodejs async each inside each inside waterfall
我已经为此苦思冥想太久了。也许这里有人可以帮我一下?
我有一个包含对象数组的对象,在继续之前我需要依次对每个对象进行一些操作。这是一个简化的示例,是我一直在尝试的众多示例之一:
var demo = {
one: ['1'],
two: ['2'],
three: ['3', '4', '5']
};
async.waterfall([
function(callback) {
console.log("Step 1");
setTimeout(function() {
console.log("Doing stuff...");
callback(null, demo);
}, 1000);
},
function(prevData, callback) {
console.log("Step 2");
async.each(prevData, function(obj) {
async.each(obj, function(item, callback2) {
setTimeout(function() {
console.log("Doing stuff for item: "+item);
callback2(null, demo);
}, 1000);
});
});
callback(null, demo);
}
], function(err) {
if(err) {
alertify.error("Unhandled exception: "+err);
} else {
console.log("All stuff done.");
}
});
我期待的是:
Step 1
Doing stuff...
Step 2
Doing stuff for item: 1
Doing stuff for item: 2
Doing stuff for item: 3
Doing stuff for item: 4
Doing stuff for item: 5
All stuff done.
但我得到的是:
Step 1
Doing stuff...
Step 2
All stuff done.
Doing stuff for item: 1
Doing stuff for item: 2
Doing stuff for item: 3
Doing stuff for item: 4
Doing stuff for item: 5
如果一直在尝试,可能是我能想到的每个级别的回调的所有组合,除了正确的那个。一定很明显,但我就是不明白...
序列本身是正确的,但是应该操作项目的函数并没有执行 before later。
问题出在这部分:
function(prevData, callback) {
console.log("Step 2");
async.each(prevData, function(obj) {
async.each(obj, function(item, callback2) {
setTimeout(function() {
console.log("Doing stuff for item: "+item);
callback2(null, demo);
}, 1000);
});
});
callback(null, demo);
}
在 async.each
之后,您立即调用 callback(null, demo);
。这是在 async.each 完成之前。您只需要在 async.each 完成后调用 callback
。您可以通过向 async.each
添加另一个回调作为第三个参数来执行此操作,如下所示:
function (prevData, callback) {
console.log("Step 2");
async.each(prevData, function (obj) {
async.each(obj, function (item, callback2) {
setTimeout(function () {
console.log("Doing stuff for item: " + item);
callback2(null, demo);
}, 1000);
});
}, function asyncEachDone(err) {
callback(err, prevData)
})
}
我已经为此苦思冥想太久了。也许这里有人可以帮我一下?
我有一个包含对象数组的对象,在继续之前我需要依次对每个对象进行一些操作。这是一个简化的示例,是我一直在尝试的众多示例之一:
var demo = {
one: ['1'],
two: ['2'],
three: ['3', '4', '5']
};
async.waterfall([
function(callback) {
console.log("Step 1");
setTimeout(function() {
console.log("Doing stuff...");
callback(null, demo);
}, 1000);
},
function(prevData, callback) {
console.log("Step 2");
async.each(prevData, function(obj) {
async.each(obj, function(item, callback2) {
setTimeout(function() {
console.log("Doing stuff for item: "+item);
callback2(null, demo);
}, 1000);
});
});
callback(null, demo);
}
], function(err) {
if(err) {
alertify.error("Unhandled exception: "+err);
} else {
console.log("All stuff done.");
}
});
我期待的是:
Step 1
Doing stuff...
Step 2
Doing stuff for item: 1
Doing stuff for item: 2
Doing stuff for item: 3
Doing stuff for item: 4
Doing stuff for item: 5
All stuff done.
但我得到的是:
Step 1
Doing stuff...
Step 2
All stuff done.
Doing stuff for item: 1
Doing stuff for item: 2
Doing stuff for item: 3
Doing stuff for item: 4
Doing stuff for item: 5
如果一直在尝试,可能是我能想到的每个级别的回调的所有组合,除了正确的那个。一定很明显,但我就是不明白...
序列本身是正确的,但是应该操作项目的函数并没有执行 before later。
问题出在这部分:
function(prevData, callback) {
console.log("Step 2");
async.each(prevData, function(obj) {
async.each(obj, function(item, callback2) {
setTimeout(function() {
console.log("Doing stuff for item: "+item);
callback2(null, demo);
}, 1000);
});
});
callback(null, demo);
}
在 async.each
之后,您立即调用 callback(null, demo);
。这是在 async.each 完成之前。您只需要在 async.each 完成后调用 callback
。您可以通过向 async.each
添加另一个回调作为第三个参数来执行此操作,如下所示:
function (prevData, callback) {
console.log("Step 2");
async.each(prevData, function (obj) {
async.each(obj, function (item, callback2) {
setTimeout(function () {
console.log("Doing stuff for item: " + item);
callback2(null, demo);
}, 1000);
});
}, function asyncEachDone(err) {
callback(err, prevData)
})
}