Node.js Функция поиска MongoDb игнорирует ожидание - PullRequest
0 голосов
/ 02 октября 2018

Мне нужно, чтобы функция обратного вызова find из Node.js mongodb 3.1.6 была запущена перед оператором возврата асинхронной функции, однако оператор возврата вызывается перед функцией обратного вызова, даже если впереди есть ожидание.

async function(myId) {
  const myObject = MyObject()
  await collection.find({where: {id: myId}}, async (err, results) => {
        if (err) {
          logger.error('error');
        }
        myObject.add(results);
      });
  return myObject
}

Я видел несколько примеров, где вместо find(query, callback) использовался шаблон find(query).toArray().Но это не работает в моем случае.Мы используем Node.js mongodb 3.1.6 с loopback-connector-mongodb, возможно, это связано с проблемой.

1 Ответ

0 голосов
/ 02 октября 2018

Если Монго не предоставляет функцию ответа на обещание, то пообещайте эту функцию самостоятельно.Ни та оболочка, создающая обещание, ни анонимный обратный вызов, который он использует, не должны объявляться как асинхронные, но вызывающая сторона должна ....

function findById(collection, myId) {
  return new Promise((resolve, reject) => {
    collection.find({where: {id: myId}}, (err, results) => {
      (err)? reject(err): resolve(results);
    });
  });
}

// now callers can use the async await pattern...
async someFunction() {
  try {
    let myId = // ...
    let collection = // ...
    let results = await findById(collection, myId);
    // do something with results
  } catch (err) {
    // error
  }
}

Ключевая идея заключается в том, что collection.find с обратным вызовом не подходит дляждать, потому что это не возвращает обещание.Функция анонимного обратного вызова, которую вы передаете ей, не является асинхронной функцией ... она выполняет свою работу сразу же, как только find вызывает ее обратно.Поэтому мы строим обещание на основе монго, а затем используем новый синтаксис async / await с этим обещанием.

...