我有一个使用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/