【问题标题】:How do I fix this async/await function?如何修复此异步/等待功能?
【发布时间】:2020-02-26 03:57:24
【问题描述】:

我正在尝试使用 async 和 await 获取我的 mongodb 集合中的文档数。当我运行这段代码时,我得到“TypeError: cb is not a function”。

我已经尝试使用 Promise 来实现它,但是我对这个主题仍然缺乏经验,并且我仍在学习如何使用 Promise。

电话来了

  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 "

【问题讨论】:

  • 如果没有更多信息,这将很难回答。尝试为错误提供完整的堆栈跟踪。 cb 是在哪里定义的?

标签: javascript node.js mongodb asynchronous


【解决方案1】:

实际上,您不需要asyncawait,因为它已经是一个承诺。只需在末尾添加then

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

【讨论】:

    【解决方案2】:

    documentCount() 是一个async 函数。因此,它返回一个承诺。所有async 函数都返回一个承诺。因此,您从 Promise 中获取价值的方式与任何 Promise 相同。你使用.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() 中显示的那样异步处理它。

    【讨论】:

    • @nathananderson - 这回答了你的问题吗?如果是这样,您可以通过单击答案左侧的复选标记在此处向社区表明这一点。这也将为您在 stackoverflow 上赢得一些声誉点,以遵循正确的程序。如果这没有回答您的问题,请评论您仍然对问题的哪一部分感到困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 2021-08-23
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    相关资源
    最近更新 更多