从回调中调用 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 }
顺便说一句,如果我在 "async.cps" 行中内联 foo 实现,它就可以工作(但这不是一个选项,因为它是一个外部库)。
有什么想法吗?
我查看了您使用的库,从外观上看(数量不多,当然也没有工作示例),您没有正确使用它。
async(fn)
将 return 一个接受一些输入值的函数,并且在执行时将 return 一个承诺(可能 standard Promises/A+)。在内部,它将使用输入参数调用 fn
,并在 fn
具有 returned 时解析 returned 承诺。
async.cps(...)
将 return 一个接受一些输入值的函数 和 一个节点样式回调函数 (function (err, res)
) 并且在执行时将return 无效 (undefined
)。在内部,它将使用输入参数调用 fn
,并在 fn
已使用适当的值 return 时调用回调函数。
您的代码所做的是使用 async(fn)
创建一个函数,然后将此函数传递给 async.cps(..)
,就像您调用 async.cps(async(fn))
一样,但这没有任何意义。
如果您想 "convert" 使用此库对节点样式回调函数的承诺(不承诺!),您可以这样做:
function moo() {
var f = async.cps(function() {
return await (foo())
})
f(function(err, res) {
console.log(res)
})
}
您对 foo
函数进行了双重异步处理。以下是您的选项,具体取决于您是否可以修改 foo
的声明:
保持 foo
异步,并使用 cps
:
创建一个接受节点式回调的函数 f
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();
我有一个使用 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)
将 return 一个接受一些输入值的函数,并且在执行时将 return 一个承诺(可能 standard Promises/A+)。在内部,它将使用输入参数调用 fn
,并在 fn
具有 returned 时解析 returned 承诺。
async.cps(...)
将 return 一个接受一些输入值的函数 和 一个节点样式回调函数 (function (err, res)
) 并且在执行时将return 无效 (undefined
)。在内部,它将使用输入参数调用 fn
,并在 fn
已使用适当的值 return 时调用回调函数。
您的代码所做的是使用 async(fn)
创建一个函数,然后将此函数传递给 async.cps(..)
,就像您调用 async.cps(async(fn))
一样,但这没有任何意义。
如果您想 "convert" 使用此库对节点样式回调函数的承诺(不承诺!),您可以这样做:
function moo() {
var f = async.cps(function() {
return await (foo())
})
f(function(err, res) {
console.log(res)
})
}
您对 foo
函数进行了双重异步处理。以下是您的选项,具体取决于您是否可以修改 foo
的声明:
保持 foo
异步,并使用 cps
:
f
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();