Node.JS 等待变量被设置

标签 node.js mongodb asynchronous callback

我想做的是允许指定 sort_order 或留空。 当它被指定时,它就会被使用。 如果未指定,则会在数据库中查询最大数字,该数字会递增并使用。 我的问题是数据库调用是异步的并且位于“if”语句内。

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

代码片段如下所示:

  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);

提前致谢,

詹姆斯

编辑(08/06/2018):我认为这个问题与建议的另一个问题不同,因为存在 sort_order 不是未定义并且可以预先指定的情况。使用其他问题的答案,可能必须写入重复内容(在 if 语句内的回调内以及 if 语句之后)

最佳答案

您应该从回调转向 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 block ):

 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 标记它,这样它“等待”您的数据。

关于Node.JS 等待变量被设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50751048/

相关文章:

node.js - 如何在 Node js 上只使用来自 rabbitmq 的一条消息

node.js - MongoNetworkError : connection 3 to cluster0-shard-00-02-z0urk. mongodb.net:27017 已关闭

mongodb - 如何删除mongodb中的深层嵌套对象

javascript - Node.js/Express 和 Mongoose : Make an "observable" mongodb Connection with automatic pull on new Data?

node.js - node-mongo-native 迁移框架

c# - begin方法为什么要带参数?

javascript - 异步设置 ReactJS 状态

node.js - 在 NodeJs 中杀死由 spawn 触发的 FFmpeg 进程

javascript - 在 Node.js 中将 Buffer 转换为 ReadableStream

reactjs - react ,带有异步更新程序参数的setState?