Как мне исправить эту функцию async / await? - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь получить количество документов в моей коллекции mongodb, используя async и await. Когда я запускаю этот фрагмент кода, я получаю «TypeError: cb не является функцией».

Я пытался использовать обещания, чтобы заставить это работать, однако я все еще неопытен в этой теме, и я все еще учусь тому, какработать с обещаниями.

Вот вызов

  getFlashCard : function(colName, flashID, callback) {

    var docCount = documentCount();

    console.log(docCount);
   }

Вот функция

 async function documentCount() {
     const count = await mongodb.collection("Interview  Questions").count();              
     return count;
   }

Я получаю сообщение об ошибке "cb (err, val) ^

TypeError: cb не является функцией в runInAsyncScope "

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

documentCount() является функцией async. Таким образом, он возвращает обещание. Все функции async возвращают обещание. Таким образом, способ получения ценности из обещания такой же, как и для любого обещания. Вы используете .then() или await на нем. Таким образом, в getFlashCard() вы могли бы сделать что-то вроде этого:

getFlashCard : function(colName, flashID, callback) {

    documentCount().then(docCount => {
        console.log(docCount);
    }).catch(err => {
        console.error(err);
    });
}

Это предполагает, что вы правильно используете mongodb.collection().count() и что оно возвращает обещание. Если это не так, то вам также придется это исправить (лично я не знаю mongodb).

К вашему сведению, вы создали documentCount() в надежде превратить асинхронное значение в синхронное. Вы не можете сделать это в Javascript. В то время как await приостанавливает выполнение внутри функции и позволяет вам писать более синхронно выглядящий код для асинхронных операций, он не работает через границу функции. Вы не можете изменить асинхронное значение на синхронное значение в Javascript. Таким образом, любой, кто хочет использовать значение docCount, должен будет работать с ним асинхронно, как я показал выше в getFlashCard().

0 голосов
/ 30 октября 2019

На самом деле вам не нужны async и await для этого, потому что это уже обещание. Просто добавьте then в конце:

 mongodb.collection("Interview  Questions").count().then(count => {
 console.log("counted: " + count)
 })
...