我有一个关于async.each行为的问题。考虑一下守则:
const examples = [1,2];
const asyncTask = (index) => {
return new Promise(resolve => {
setTimeout(() => {
console.log(`Inside setTimeout-${index}`);
resolve(true);
}, 1500)
});
}
function testingAsyncEach(callback){
async.each(examples, (example, innerCallback) => {
asyncTask(example).then(isDone => {
console.log(`isDone: ${isDone}`);
innerCallback(null);
});
}, err => {
console.log('done testingAsyncEach');
return callback()
})
}
testingAsyncEach(() => {console.log('final callback testingAsyncEach');})一个简单的代码,使用nodejs中的“异步”模块,使用数组1,2,并对数组中的每个项执行函数"asyncTask“,该函数返回一个新的承诺,在超时1.5秒后得到解析。
在这个场景中,程序的输出是:
Inside setTimeout-1
isDone: true
Inside setTimeout-2
isDone: true
done testingAsyncEach
final callback testingAsyncEach但是,当我将"testingAsyncEach“函数更改为使用”等待“语法时:
function testingAsyncEach(callback){
async.each(examples, async (example, innerCallback) => {
const isDone = await asyncTask(example);
console.log(`isDone: ${isDone}`);
innerCallback(null);
}, err => {
console.log('done testingAsyncEach');
return callback()
})
}async.each没有等待"asyncTask“的结束。产出:
Inside setTimeout-1
isDone: true
done testingAsyncEach
final callback testingAsyncEach
Inside setTimeout-2
isDone: true你能帮我理解为什么用“等待”而不是“然后”来改变行为吗?我如何才能仍然使用“等待”语法并获得适当的输出?谢谢!
发布于 2021-07-18 20:00:50
根据异步模块的文档,如果您传递一个async函数,它将不会将innerCallback传递给您的函数。因此,我认为您的innerCallback(null)调用出错了,使得async.each提前返回。(第二个例子已经“启动”了,所以以后还会发生)
检查err是否设置为错误,如果是,记录它。
如果这是问题所在,删除innerCallback参数和调用就可以解决这个问题。
https://stackoverflow.com/questions/68432526
复制相似问题