【问题标题】:Can't call nodeify on async function but can call then()不能在异步函数上调用 nodeify 但可以调用 then()
【发布时间】:2018-12-19 01:29:29
【问题描述】:

我有这两个功能。

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

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

当我在async 上调用then 时,它可以正常工作,类似于promise。例如,以下代码有效。

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

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

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

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

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

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

【问题讨论】:

  • 简而言之,.nodify() 是 Bluebird Promise 的一种糖方法。原生 javascript 承诺没有这样的方法。
  • 使用Bluebird.resolve(testAsync()).nodify(callback)
  • 应该使用 .asCallback() 而不是 .nodeify() 与较新的 Bluebird。上一条评论拼错了nodeify

标签: node.js promise async-await


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2019-09-30
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    相关资源
    最近更新 更多