【问题标题】:nodejs - async.each function with async operation on each iterationnodejs - async.each 函数,每次迭代都有异步操作
【发布时间】:2021-09-26 15:31:30
【问题描述】:

我对 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”会改变行为吗?我怎样才能仍然使用“等待”语法并获得正确的输出? 谢谢!

【问题讨论】:

    标签: javascript node.js async-await promise


    【解决方案1】:

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

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

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

    【讨论】:

    • 你是对的,innercallback函数不是由async.each传递的。谢谢!
    猜你喜欢
    • 2016-03-17
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多