在promise库中,bluebird具有函数promisifyAll或其他类似的库,它们声称将具有回调模式的异步函数转换为基于promise的。 resolve()
,reject()
或done()
..那么它如何工作?
例如:
function myAsync1 (data, url, callBack) {...}
如果我放进去
Promise.promisify(myAsycn1);
然后我的功能会这样工作..
myAsync1('{..}', 'http://..').then(function(){...});
这一直困扰着我。是否有一种模式,Bluebird promisifyAll会将异步的nonpromise库或函数遵循以将它们转换为基于promise的方法,或者有某种魔术可以将它们转换。
如果不是,那么有什么要求,以及如何与现有的库(如mongodb等)一起使用。
最佳答案
是的,有一种模式。它转换的函数必须将回调作为其最后一个参数。此外,它必须将错误作为第一个参数传递给回调(如果没有错误,则传递给null
),并将返回值作为第二个参数传递。
由于进行了优化,BlueBird promisify
函数很难遵循,因此我将展示一种简单的编写方法:
function promisify(fn) {
return function() {
var that = this; // save context
var args = slice.call(arguments); // turn into real array
return new Promise(function(resolve, reject) {
var callback = function(err, ret) { // here we assume the arguments to
// the callback follow node.js
// conventions
if(err != undefined) {
reject(err);
} else {
resolve(ret);
}
};
fn.apply(that, args.concat([callback])); // Now assume that the last argument will
// be used as a callback
});
};
}
现在,我们可以通过循环遍历目标对象中的函数并在每个对象上使用
promisifyAll
来实现promisify
。关于javascript - promisifyAll如何工作,或对它有什么要求?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29595449/