在expressjs中,我通常使用如下的异步函数:
function foo(callback) {
var bar = {a: 1, b: 2};
callback(null, bar);
}
foo(function(err, result) {
// result is {a: 1, b: 2}
});
在Koajs中,我在路线功能中使用yield
,如下所示:
function foo(callback) {
var bar = {a: 1, b: 2};
callback(null, bar);
}
var result = yield foo.bind(null); // [{a: 1, b: 2}]
我希望结果是{a: 1, b: 2}
,但实际上结果是数组[{a: 1, b: 2}]
。
那么,我怎样才能获得koajs的期望值?
答案 0 :(得分:0)
除了Koa vs Co shenanigans之外,你应该真正宣传你的异步方法,最好是修改原始功能(如果你有可能):
function foo() {
let bar = { a: 1, b: 2 };
return Promise.resolve(bar);
}
let data = yield foo();
如果那个不是的可能性(转换的函数太多,仍在其他地方用作回调,使用其他人的函数等),你可以像这样包装它们:
function fooPromise() {
return new Promise((resolve, reject) => {
// assume foo is defined externally
foo((err, result) => {
if (err)
return reject(err);
return resolve(result);
});
});
}
let data = yield fooPromise();
有些库会为你包装回调方法,例如bluebird,但如果只有少数几个要覆盖它们,那么你自己就可以直截了当了。