在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/

10-12 14:19