根据Bluebird关于promisification的文档:
如果对象已经有方法的promisified版本,它将被跳过。
事实上,promisifyAll()
还会创建一个已经宣传过的函数的Async
版本,预计会是:
在某种意义上,幂等函数会立即返回。所指出的那样
因此,在以下示例中,我期望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
答案 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 code的checks 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]
?