【问题标题】:Node.JS waiting for variable to be set [duplicate]Node.JS等待设置变量[重复]
【发布时间】:2018-11-17 22:45:53
【问题描述】:

我要做的是允许指定 sort_order 或将其留空。 当它被指定时,它被使用。 未指定时,查询数据库中的最大数字,递增并使用。 我的问题是数据库调用是异步的并且在“if”语句中。

在将新数据插入数据库之前确保“sort_order”未定义的最佳做法是什么?

一段sn-p代码如下所示:

  if (sort_order == undefined) {
    MongoClient.connect(dbUrl, function (err, db) {
      var dbo = db.db("HIDDEN");

      dbo.collection("HIDDEN").findOne({}, {"sort": { sort_order: -1 } }, function (err, data) {
        sort_order = data.sort_order + 1;
      });

    });
  }

  console.log(sort_order);

提前致谢,

詹姆斯

编辑(2018 年 8 月 6 日):我相信这个问题与建议的另一个问题不同,因为在某些情况下 sort_order 不是未定义的并且可以预先指定。使用其他问题的答案,可能必须编写重复项(在 if 语句内的回调内部和 if 语句之后)

【问题讨论】:

    标签: node.js mongodb asynchronous callback


    【解决方案1】:

    你应该从回调转向 Promises 或 Async/Await,后者更容易阅读:

    async function retrieveValue(sort_order) {
        if (sort_order === undefined) {
            const db = await MongoClient.connect(dbUrl);
            const dbo = db.db("HIDDEN");
            const data = await dbo.collection("HIDDEN").findOne({}, {"sort": { sort_order: -1 }});
            return data.sort_order + 1;
          };
        return sort_order;
      }
    

    编辑(使用 try-catch 块):

     async function retrieveValue(sort_order) {
             try {
                if (sort_order === undefined) {
                    const db = await MongoClient.connect(dbUrl);
                    const dbo = db.db("HIDDEN");
                    const data = await dbo.collection("HIDDEN").findOne({}, {"sort": { sort_order: -1 }});
                    return data.sort_order + 1;
                }
             } catch (error) {
                 console.log(error);
             }
        return sort_order;
      }
    

    您基本上在定义函数时将其标记为async,并且每当您期待Promise 时,您将其标记为await,以便它“等待”您的数据。

    【讨论】:

    • 正是我所追求的!我总是发现 async/await 概念令人困惑,但这很好地清除了它。但是,如果“const data =...”行返回错误,您将如何处理?使用回调时,err 和 data 有两个参数。
    • @JamesB。查看编辑后的答案,您可以将其包装在 try-catch 块中以检索 catch 语句中的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    相关资源
    最近更新 更多