从回调调用asyncwait
calling asyncwait from a callback
我有一个使用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 }
顺便说一句,如果我内联foo的实现在async。(但这不是一个选项,因为它是一个外部库)。
任何想法?
我查看了您使用的库,从它的外观来看(没有太多,当然没有工作示例),您没有正确使用它。
async(fn)
将返回一个接受一些输入值的函数,并在执行时返回一个promise(可能是标准的Promises/a +)。在内部,它将使用输入参数调用fn
,并在fn
返回时解析返回的承诺。
async.cps(...)
将返回一个接受一些输入值的函数和一个节点风格的回调函数(function (err, res)
),在执行时将返回一个void (undefined
)。在内部,它将使用输入参数调用fn
,并在fn
返回适当的值时调用回调函数。
你的代码所做的是用async(fn)
创建一个函数,然后把这个函数传递给async.cps(..)
,就像你调用async.cps(async(fn))
一样,但这没有任何意义。
如果你想使用这个库将一个promise"转换"为一个node风格的回调函数(不承诺!),你可以这样做:
function moo() {
var f = async.cps(function() {
return await (foo())
})
f(function(err, res) {
console.log(res)
})
}
您对foo
函数进行了双重异步。以下是您的选项,这取决于您是否可以修改foo
的声明:
保持foo
异步,并创建一个函数f
,该函数使用cps
接受节点式回调:
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, 1000);
}
function moo() {
var f = async.cps(function() {
return await(foo());
});
f(function(err, res) {
console.log(res);
});
}
moo();
让foo
保持异步,使用异步moo
:
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, 1000);
}
var moo = async(function() {
try {
var res = await(foo());
console.log(res);
} catch (err) {
}
});
moo();
让foo
在声明时已经是cps
了:
var async = require('asyncawait/async');
var await = require('asyncawait/await');
var Promise = require('bluebird');
var foo = async.cps(function() {
var resultA = await (Promise.promisify(bar));
return 111;
});
function bar(callback) {
setTimeout(callback, 1000);
}
function moo() {
foo(function(err, res) {
console.log(res);
});
}
moo();
相关文章:
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- D3在一个调用中绘制不同的SVG形状,没有可见性
- 如何从Java/scala调用js美化程序
- 如何调用这个匿名 JavaScript 函数
- 如何从模块链中调用函数.导出到节点中
- 我需要从php调用javascript或jquery
- Chrome开发工具(如何知道我在调用哪个javascript对象)
- 单击按钮后如何逐个调用分区,上一个分区将隐藏
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- Twitter Bootstrap typeahead:使用“this”获取上下文/调用元素
- node.js:setInterval()正在跳过调用
- 如何在单击复选框后调用控制器方法
- 如何在JQuery函数中定义一个值,然后调用另一个函数并使用该值
- 使用Google Visualization动态调用构造函数
- 如何在webView,Android中从@JavascriptInterface方法调用Javascript
- 是否可以将一个函数输入连接到另一个函数调用的文本
- 调用函数内部的函数
- 函数未在Object.keys或Object.getOwnPropertyNames下列出,但可以调用
- Javascript/jQuery中的并行Ajax调用
- 从回调调用asyncwait