使用promisifyAll

时间:2017-05-18 10:08:34

标签: node.js promise bluebird

根据Bluebird关于promisification的文档:

  

如果对象已经有方法的promisified版本,它将被跳过。

事实上,promisifyAll()还会创建一个已经宣传过的函数的Async版本,预计会是:

  在某种意义上,幂等函数会立即返回。

正如问题Idempotent promisify #159

所指出的那样

因此,在以下示例中,我期望obj.foo()obj.fooAsync()都有相同的结果。

let obj = {
    foo: function(){
        return Promise.resolve('I am foo!!!')
    }
}
obj = Promise.promisifyAll(obj)
obj.foo().then(msg => console.log(msg))      // > I am foo
obj.fooAsync().then(msg => console.log(msg)) // prints nothing

我误解哪一部分?

正在运行示例here

2 个答案:

答案 0 :(得分:1)

  

我误解了哪一部分?

您的In [17]: a1.__dict__ Out[17]: {} In [18]: a2.__dict__ Out[18]: {'class_member': 'foo'} In [19]: A.__dict__ Out[19]: mappingproxy({'__dict__': <attribute '__dict__' of 'A' objects>, '__doc__': None, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'A' objects>, 'class_member': 42}) 功能已经被宣传。它不是 - 它只是返回一个承诺。而作为Petka points out,“在代码中无法判断某个函数是否为返回函数。”(至少在一般意义上,有 some 我们可以告诉的函数。)

“被宣传”,特别是在idempotent foo函数的上下文中,是指Promise.promisify调用的结果(或通过{{1创建的)的函数}})。它是this part of the codechecks whether the function is tagged as being bluebird-created

更好的示范:

Promise.promisify

答案 1 :(得分:0)

不是真的答案,但我确实发现了一些东西......不确定它意味着什么,但我想分享:

const Promise = require('bluebird');

const obj = {
    foo: () => {
        return new Promise((resolve)=> {
            resolve('Hello!!!');
        });
    }
};

const new_obj = Promise.promisifyAll(obj);
console.log(new_obj.foo());
console.log(new_obj.fooAsync());
console.log(new_obj);

返回:

Promise {
  _bitField: 33554432,
  _fulfillmentHandler0: undefined,
  _rejectionHandler0: 'Hello!!!',
  _promise0: undefined,
  _receiver0: undefined }
Promise {
  _bitField: 134217728,
  _fulfillmentHandler0: undefined,
  _rejectionHandler0: undefined,
  _promise0: undefined,
  _receiver0: undefined }
{ foo: [Function: foo], fooAsync: [Function: ret] }

问题:

  • 为什么_fulfillmentHandler0: undefined
  • 为什么_rejectionHandler0的{​​{1}} foo返回'Hello!!!',我们期待_fulfillmentHandler0
  • 为什么foo: [Function: foo]fooAsync: [Function: ret]