繁体   English   中英

nodejs - async.each 函数在每次迭代中进行异步操作

[英]nodejs - async.each function with async operation on each iteration

我有一个关于 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 中的“async”模块的简单代码,使用数组 [1,2] 并在数组中的每个项目上执行函数“asyncTask”,该函数返回一个新的承诺,该承诺在 1.5 秒超时后得到解决。

在这种情况下,程序的输出是:

Inside setTimeout-1
isDone: true
Inside setTimeout-2
isDone: true
done testingAsyncEach
final callback testingAsyncEach

但是当我将“testingAsyncEach”函数更改为使用“await”语法时:

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

你能帮我理解为什么使用“await”而不是“then”来改变行为吗? 我怎样才能仍然使用“await”语法并获得正确的输出? 谢谢!

根据 async 模块的文档,如果您传递async函数,它不会将innerCallback传递给您的函数。 我相信您的innerCallback(null)调用因此出错,使async.each返回。 (虽然第二个例子已经“启动”了,所以之后仍然会发生)

检查err是否设置为错误,如果是,请记录。

如果这是问题,删除innerCallback参数和调用应该可以解决它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM