【问题标题】:promisifying an already promisified function with promisifyAll使用 promisifyAll 承诺已经承诺的功能
【发布时间】:2017-10-18 02:16:20
【问题描述】:

根据 Bluebird 关于promisification 的文档:

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

事实上,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

【问题讨论】:

    标签: node.js promise bluebird


    【解决方案1】:

    我误解了哪一部分?

    你的foo 函数已经被承诺了。它不是 - 它只是返回一个承诺。正如 Petka points out,“不可能在代码中判断某个函数是否是一个承诺返回函数。”(至少在一般意义上,有 一些我们可以知道的功能)。

    被“承诺”,尤其是在idempotent Promise.promisify 函数的上下文中,是指作为Promise.promisify 调用(或通过Promise.promisifyAll 创建)的结果的函数。关于this part of the codechecks whether the function is tagged as being bluebird-created

    更好的演示:

    const obj = {
        foo(callback) {
            callback(null, 'I am foo!!!')
        }
    };
    Promise.promisifyAll(obj);
    obj.fooAsync().then(console.log) // > I am foo
    // so far so good
    
    Promise.promisifyAll(obj);
    console.assert(typeof obj.fooAsyncAsync == "undefined"); // it didn't promisify again
    console.assert(obj.fooAsync === Promise.promisify(obj.fooAsync));
    

    【讨论】:

      【解决方案2】:

      不是一个真正的答案,但我确实发现了一些东西......不知道这意味着什么,但我想我会分享:

      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
      • 为什么foo_rejectionHandler0 是我们期望_fulfillmentHandler0'Hello!!!' 返回?
      • 为什么是foo: [Function: foo]fooAsync: [Function: ret]

      【讨论】:

      • 不要将任何内容读入 Bluebird 承诺的内部表示。这都是依赖于实现的魔法。
      猜你喜欢
      • 2015-05-05
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 2023-04-01
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      相关资源
      最近更新 更多