javascript - 从回调中调用 asyncwait

标签 javascript node.js callback async-await promise

我有一个使用async/await编写的nodejs库模块。我尝试从使用常规回调的库中使用它。这是示例代码:

var async = require('asyncawait/async');
var await = require('asyncawait/await');
var Promise = require('bluebird');

var foo = async (function() {
    var resultA = await (Promise.promisify(bar));
    return 111;
})

function bar(callback) {
  setTimeout(callback, 2000)
}

function moo() {
  var f = async.cps(foo)

  f(function(err, res) {
    console.log(res)
  })

}

moo()

我期望 console.log 打印 111,但它却打印:

{ _bitField: 0,
  _fulfillmentHandler0: undefined,
  _rejectionHandler0: undefined,
  _progressHandler0: undefined,
  _promise0: undefined,
  _receiver0: undefined,
  _settledValue: undefined }

顺便说一句,如果我在“async.cps”行中内联 foo 实现,它就可以工作(但这不是一个选项,因为它是外部库)。

有什么想法吗?

最佳答案

我查看了您使用的库,从它的外观(没有太多,当然也没有工作示例)来看,您没有正确使用它。

async(fn) 将返回一个接受一些输入值的函数,并在执行时返回一个 promise (可能是 standard Promises/A+ )。在内部,它将使用输入参数调用 fn,并在 fn 返回时解析返回的 Promise。

async.cps(...) 将返回一个接受一些输入值的函数和一个 Node 样式回调函数 (function (err, res) ),执行后将返回 void (undefined)。在内部,它将使用输入参数调用 fn,并在 fn 返回适当的值时调用回调函数。

您的代码所做的是使用 async(fn) 创建一个函数,然后将此函数传递给 async.cps(..),就像您调用 async.cps(async(fn)),但这没有任何意义。

如果您想使用此库将 promise “转换”为 Node 样式回调函数(没有 promise !),您可以执行以下操作:

function moo() {
  var f = async.cps(function() {
    return await (foo())
  })

  f(function(err, res) {
    console.log(res)
  })
}

关于javascript - 从回调中调用 asyncwait,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32876864/

相关文章:

javascript - 如何使用并行子进程在大数组上执行 "work"?

node.js - “Error: Please install pg package manually” 尝试运行 “npm run serve:dev” 时?

java - 如何在 View 完全渲染后进行回调?

javascript - 通过ajax调用更新DOM后,jQuery on click事件丢失

javascript - 在我的案例中,如何使用 AngularJs 显示数组?

node.js - 在 vscode 中调试时如何将 NODE_PATH 设置为 $(pwd)

actionscript-3 - AS3 - 我可以访问调用我的对象(或函数)吗?

Javascript - 使用 soundcloud API 进行异步操作

javascript - 具有右箭头形状的自定义 div

Javascript JQuery 第一次用户尝试将表单放置在具有特定 url 的图片下方