【问题标题】:mocha + mongodb wait for async resultmocha + mongodb 等待异步结果
【发布时间】:2018-08-28 00:49:41
【问题描述】:

所以这是我的函数,它应该插入我稍后需要的数据:

const mongo = require('mongoskin');
const mochaDB = mongo.db(MONGO_URL, {});

function createTestAdmin() {
  const userData = createTestUserData();
  mochaDB.collection('users').insert(userData, function(err, result) {
    if (err) throw err;
  });
}

所以现在我的问题是,插入是异步运行的,在我可以访问插入的数据之前,我必须等到这个函数完成。

注意 1:这发生在 mocha 测试运行中的 before 块期间。

注意2:我使用的是mongoskin,它是mongodb客户端的包装器,但是如果mongodb客户端有解决方案,我可以扔掉mongoskin。

有没有办法等待数据库完成操作?

【问题讨论】:

    标签: javascript node.js mongodb promise mocha.js


    【解决方案1】:

    我不确定 mongoskin,但本机客户端的 insert 方法返回一个承诺,该承诺会在插入完成时解析。

    另外,如果你从 Mocha 的 before 方法返回一个 Promise,在这个 Promise 解决(或拒绝)之前,mocha 不会开始任何测试。

    您可以希望重构您的代码,以便 before 方法返回由 insert 方法返回的承诺。

    可能是这样的:

    function createTestAdmin() {
      const userData = createTestUserData();
      return mochaDB.collection('users').insert(userData, function(err, result) {
        if (err) throw err;
      });
    }
    before(function() {
    // other code
    return createTestAdmin()
    })
    

    如果您的“之前”函数中有更多异步操作,您可以返回Promise.all([p1, p2...]),其中p1p2 等是每个异步操作的一个承诺。

    【讨论】:

    • 谢谢我要去检查
    • 所以在Promise.all([p1, p2...]) 中,我可以将数组中的元素替换为运行异步代码的函数,例如createTestAdmin()?
    • @Gobliins 只要这些函数返回你需要等待的承诺,是的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 2018-06-11
    • 2018-07-24
    相关资源
    最近更新 更多