【问题标题】:Nodejs script executing without waiting for Mongodb query无需等待 Mongodb 查询即可执行 Nodejs 脚本
【发布时间】:2022-01-11 19:29:19
【问题描述】:

我在 nodejs 文件中有以下部分

client.db('metro4').collection('Station').findOne({"Name": variabled2}, function(err, res2) {
        if(err) throw err;
        variabled2 = res2._id;
        console.log("id2 = ", res2._id);
    });

console.log("v= ",variabled2);

myFunc(variabled);

myFunc 函数也有一些 mongodb 查询。

问题在于执行顺序。

v = undefined
then some of function results (which are obviously wrong)
id2 = 4
then other of functions results

我是在节点内部运行 MySQL 查询的,即使在长存储过程中也没有这些问题。

现在许多答案建议“异步和等待”。所以,我做了myFunc async 并尝试了这个

(async function() {
        await recur2();
    })();

但正如预期的那样,结果几乎与程序没有等待第一次查询相同。

另外,我发现 .then()Promises 一样,但是当我在上面的查询中使用回调函数时,它们显然不起作用。

提前致谢。

【问题讨论】:

  • 请添加您的 asym/await 函数的完整示例。您似乎正在尝试混合 Promises 和回调,这是一种非常先进的技术。 mongodb.github.io/node-mongodb-native/4.3/classes/… 不带回调参数返回一个 Promise。您应该将此语法与 async/await 一起使用。记住 async/await 只是 Promises 之上的语法糖。

标签: node.js mongodb async-await callback mongodb-query


【解决方案1】:

第一个查询使用回调,因此它不会等待完成。所以你需要await第一个查询,或者将myFunc放入回调中。

放置在回调中

let variabled2;
client.db('metro4').collection('Station').findOne({"Name": variabled2}, 
    function(err, res2) {
        if(err) throw err;
        variabled2 = res2._id;
        console.log("id2 = ", res2._id);

        myFunc(variabled);
    });

异步/等待

(async function() {
    let variabled2;
    const res2 = await client.db('metro4').collection('Station').findOne({"Name": variabled2})
    variabled2 = res2._id;
    console.log("id2 = ", res2._id);
    myFunc(variabled);
})()

我建议async/await 解决方案,因为它更干净。

【讨论】:

  • SyntaxError: await is only valid in async functions and the top level bodies of modules。我猜查询的函数也应该是异步的
  • @mr.loop 哦,对不起,我假设您在函数内部运行。是的,您可以简单地将其包装在异步函数中。刚刚编辑了答案。
  • 嵌套回调可以工作,但在(async function() { await recur2(); console.log("Hello") })(); 中,Hello 在 recur2 完成之前被安慰。不知道为什么。 recur2 是一个异步递归(带有 mongo 查询)函数。
  • 嗯,这应该可以正常工作,我想这是关于不在recur2() 内部等待,即使用thencallback。我不知道到底发生了什么,因为我不知道recur2() 里面有什么,但是如果你在recur2() 的第一个上打印一些东西,那应该在Hello 之前。
  • 是的,我认为 await 没有用于该函数的递归。我遇到的问题是 async function recur() {if { // } else { await recur() } } 它说 await 仅在异步函数中有效,但 recur 是一个异步函数
猜你喜欢
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
  • 2021-06-11
  • 1970-01-01
相关资源
最近更新 更多