【问题标题】:Asynchronous Loops in Node.jsNode.js 中的异步循环
【发布时间】:2020-05-16 21:16:58
【问题描述】:

async function bald(fileName) {
    try {
        let aPayload = '';
        let aStream = fs.createReadStream(`./tmp/${fileName}`, 'utf8');
        aStream
            .on('data', (chunk) => {
                aPayload += chunk;
            })
            .on('end', async () => {
                let aJson = JSON.parse(aPayload);
                for await (let a of aJson) {
                    console.log(a.id);
                    console.log("Tick");
                    await dbItems.findOne({id: a.id}, (err, result) => {
                        console.log("Something Should Happen!");
                    });
                }
            });
    } catch (e) {
        throw e;
    }
}

这个答案是我想尝试的内容:https://stackoverflow.com/a/50874507/12640130

我发现 forEach 根本不起作用,所以我将其更改为 for ... of,但这对我没有任何影响。有人能找出我的问题吗?

当前输出:

ID
Tick
ID
Tick
ID
Tick
// ... and so on.
Something Should Happen!
Something Should Happen!
Something Should Happen!
// ... and so on.

预期输出:

ID
Tick
Something Should Happen!
ID
Tick
Something Should Happen!
ID
Tick
Something Should Happen!
// ... and so on.

【问题讨论】:

    标签: javascript node.js for-loop async-await


    【解决方案1】:

    您不能同时使用等待和回调。 它应该是以下之一:

    1. 这不会在迭代之前等待结果。
                        dbItems.findOne({id: a.id}, (err, result) => {
                            console.log("Something Should Happen!");
                        });
    
    1. 应该是您正在寻找的。​​li>
                        const result = await dbItems.findOne({id: a.id})
                        console.log("Something Should Happen!");
    

    【讨论】:

    • "你不能同时使用等待和回调。"你真的做到了。现在我明白为什么理解 Promise、async 和 await 变得如此“难”了。
    • @FooBar3098 实际上,没有硬性规定不能同时使用回调和承诺(async/await)。只是findOne()函数的API设计者没有想到。他大概在想:“哦,你给我回电了?那你可能不想要承诺了”。虽然公平地说,我永远不会允许我自己。这会令人困惑。我执行哪个?回调?承诺的.then() 回调?两个都?如果两者都执行,那么我先执行哪个等。
    • 是的。很好的例子:Axios 可以很好地与 .then 一起工作,但 MongoDB 方法却不行。不确定哪些或全部,但至少 findOne .then 是未定义的方法。
    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多