如何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 promisifyfunction是非常难以遵循的,所以我将展示一个简单的写法:

 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文档以获取更多信息。