Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript promisifyAll是如何工作的,或者it工作的要求是什么?_Javascript_Node.js_Npm_Bluebird - Fatal编程技术网

Javascript promisifyAll是如何工作的,或者it工作的要求是什么?

Javascript promisifyAll是如何工作的,或者it工作的要求是什么?,javascript,node.js,npm,bluebird,Javascript,Node.js,Npm,Bluebird,在promise库中,bluebird拥有函数promisifyAll或其他类似的库,这些库声称可以将具有回调模式的异步函数转换为基于promise的函数,即resolve()、reject()、或done()。那么它是如何工作的呢 例如: function myAsync1 (data, url, callBack) {...} 如果我把它放进去 Promise.promisify(myAsycn1); 那么我的函数会这样工作吗 myAsync1('{..}', 'http://..').

在promise库中,bluebird拥有函数promisifyAll或其他类似的库,这些库声称可以将具有回调模式的异步函数转换为基于promise的函数,即
resolve()
reject()
、或
done()
。那么它是如何工作的呢

例如:

function myAsync1 (data, url, callBack) {...}
如果我把它放进去

Promise.promisify(myAsycn1);
那么我的函数会这样工作吗

myAsync1('{..}', 'http://..').then(function(){...});
这是一直困扰我的问题。Bluebird promisifyAll是否需要遵循异步非承诺库或函数的模式来将它们转换为基于承诺的方法,或者是否有一些魔法可以将它们转换为基于承诺的方法

如果没有,则要求是什么,以及它如何与现有库(如mongodb等)一起工作。

方法将提示作为参数调用的整个模块或对象。这意味着,对象的每个属性的副本都是使用
Async
后缀创建的,这实际上是同一方法的预期版本,即您可以在其上使用
.then()
.done()
方法

例如,如果在
someModule
模块中有
doSomething()
方法,则在调用
promisifyAll(someModule)
后,将在名为
doSomethingAsync()的模块中创建一个新方法。您可以这样使用它:

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.
});
有关更多信息,请查看

Bluebird promisifyAll是否需要遵循异步非承诺库或函数的模式来将它们转换为基于承诺的方法

是的,有一种模式。它转换的函数必须期望回调作为其最后一个参数。此外,它必须将错误作为第一个参数传递给回调(
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
    });
  };
}

现在我们可以通过在目标对象中的函数上循环并在每个函数上使用
promisify
来实现
promisifyAll

注意,您的函数不是“转换的”,函数是不可变的。相反,
promisify.promisify
确实返回了一个新函数,该函数将通过回调调用旧函数。可能是@Bergi的重复项它可能是重复项,但它的标题在搜索引擎优化方面太糟糕了,以至于在搜索了四个小时后,我没有远程发现它,事实上它更倾向于点击诱饵。然而,感谢分享这个链接,它确认并澄清了很多事情!!!我知道最终的结果是什么,但我想知道的是具体结果如何?承诺依赖于内部调用,并以某种方式传递错误,因此您可以执行
.catch
…因此doSOmething()没有显示任何工作。因此,如果这是约定,那么是否意味着asyncjs不遵循约定?在这里,您可以看到,如果只有回调是第一个参数,那么函数就可以工作。这是asyncjs独有的行为吗?对于承诺。。。规则是函数应该作为最后一个参数接收回调,并且必须以err作为第一个参数调用该回调,对吗。。然而,在他们这方面,我看到的例子有
promisify.promisify('request');承诺、承诺(“fs”);承诺。承诺(“猫鼬”)等等。所有的模块/库都符合这些要求吗?MuhammadUmer这是一个使用
async
lib的误导性例子。传递给
async.series
的函数应该只接受一个参数,即回调。这些函数永远不会得到
err
参数。@穆罕默德,这些lib都遵循这个约定并不是巧合;这是所有标准库都使用的一个强大的约定,因此不使用它意味着您的代码将无法与其他任何人的代码很好地配合。