如何promisifyAll工作,或者它的工作要求是什么?
在一个承诺库蓝鸟有函数promisifyAll或其他类似的库声称转换asynchronous函数与callback模式为基于承诺的,即。 resolve()
, reject()
,或done()
..所以它是如何工作的?
例如:
function myAsync1 (data, url, callBack) {...}
如果我把它放进去
Promise.promisify(myAsycn1);
那么我的function就是这样工作的
myAsync1('{..}', 'http://..').then(function(){...});
这一直困扰着我。 有没有一种模式,asynchronous非诺言库或function需要遵循蓝鸟promisifyAll将其转换为基于承诺的方法或有一些魔法,将其转换。
如果不是那么什么要求,它是如何与现有的库,如mongodb等工作
是否有一个模式,asynchronous非诺言库或function需要遵循蓝鸟promisifyAll将其转换为基于承诺的方法
是的,有一个模式。 它转换的函数必须期待callback作为他们的最后一个参数。 此外,它必须将错误作为第一个parameter passing给callback(如果没有错误,则为null
),并将返回值作为第二个parameter passing。
由于优化,BlueBird promisify
function是非常难以遵循的,所以我将展示一个简单的写法:
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 }); }; }
现在我们可以通过遍历目标对象中的函数并使用promisify
来实现promisify
。
promisifyAll()
方法promisifies整个模块或被称为参数的对象。 这意味着对象的每个属性的副本都是使用Async
后缀创build的,而后者实际上是同一个方法的promisified版本,也就是说,您可以对其使用.then()
或.done()
方法。
例如,如果在someModule
模块中有一个doSomething()
方法, someModule
在调用Promise.promisifyAll(someModule)
之后,将在名为doSomethingAsync()
的模块中创build一个新方法。 你可以这样使用它:
var someModule = require('some-module'); Promise.promisifyAll(someModule); someModule.doSomethingAsync().then(function(result) { // do whatever you want with result, this function runs after doSomthingAsync() // is finished and the returned value is stored in 'result' variable. });
查看蓝鸟API文档以获取更多信息。