Node.JS等待设置变量

时间:2018-06-07 22:36:04

标签: 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语句之后的回调内)

1 个答案:

答案 0 :(得分:0)

你应该从回调转移到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对其进行标记,以使其“等待”您的数据。