无法在异步函数上调用nodeify但可以调用then()

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法在异步函数上调用nodeify但可以调用then()相关的知识,希望对你有一定的参考价值。

我有这两个功能。

async function testAsync(){
    console.log('async func')
}

function callback(){
    console.log('callback function.')
}

当我在then上调用async时,它的工作原理与promise类似。例如,以下代码有效。

bluebird.resolve().then(()=> console.log('then promise'))
testAsync().then(()=> console.log('then async'))

但是,当我在nodeify上调用async时,它就会出错。虽然,它适用于promise

作品 - > bluebird.resolve().nodeify(callback)

错误 - > testAsync().nodeify(callback)

这是我得到的错误。为什么这样?

TypeError: testAsync(...).nodeify is not a function
答案

该错误表明本机promise对象上没有nodeify函数。

如果你需要使用这个你真的不应该使用的函数,你必须从定义它的promise实现中获取它,并在像p.prototype.nodeify.call(testAsync())这样的对象上调用它,然后希望它不使用promise的任何内部部分实现。

或者更好地从promise实现中提取函数,因为它只是这样的:

function nodeify(cb) {
  this.then(function (v) { cb(null, v) });
  this.catch(function (err) { cb(err) });
}

可以用作nodeify.call(testAsync(), callback)

以上是关于无法在异步函数上调用nodeify但可以调用then()的主要内容,如果未能解决你的问题,请参考以下文章

异步 Mongoose 调用

以同步方式执行异步调用

等待异步函数在 dart 中无法正确执行

同步调用异步 Javascript 函数

如何使用从 Swift 代码调用的线程在 C++ 上创建异步调用函数?

Lambda 异步调用