这是一个示例代码:
function getExtendedPromise() {
const promise = new Promise((resolve) => {
setTimeout(() => {
resolve('Hi');
}, 1000)
});
promise.on = () => {
console.log('on listener called')
};
console.log('getExtendedPromise: ', promise);
return promise;
}
async function callExtendedPromise() {
await Promise.resolve();
return Promise.resolve(getExtendedPromise())
}
const promise = callExtendedPromise();
console.log('callExtendedPromise Try: ', promise);
callExtendedPromise().then((result) => {
console.log('Final Result: ', result)
});
记录结果:
callExtendedPromise Try: Promise { <pending> }
getExtendedPromise: Promise { <pending>, on: [Function] }
getExtendedPromise: Promise { <pending>, on: [Function] }
Final Result: Hi
从上面的示例可以看出,当在getExtendedPromise()函数中记录对象时,它具有on
属性。然后我将它包装在Promise.resolve
中,并将其返回给调用者,因为我希望调用者获得具有Promise
属性的on
对象。
但是,在调用callExtendedPromise()
时,我无法使用on
属性访问该包装的承诺。
如何使用on
属性获取该承诺实例?
getExtendedPromise()
是图书馆的一部分,无法修改。
P.S。扩展承诺的结构选择不是我在原始代码中的选择,而是从库中返回的结构。
答案 0 :(得分:3)
不幸的是,可能无法从Promise
函数返回扩展async
。 (摘自async function on MDN)
...异步函数的返回值隐式包装在Promise.resolve中。
如果您可以修改callExtendedPromise
并且可以将扩展部分(即对on
的任何调用)限制在该方法中,那么我就这样做了。或者,您可以使用某种返回的对象(见下文)。我一般建议不要这样做(虽然问题的真正根源是尝试扩展单个Promise
实例,然后将其用作Promise
,听起来你没有调整方式),但应该是
async function callExtendedPromise() {
await Promise.resolve();
return {extendedPromise: getExtendedPromise()};
}
...
const extendedPromise = (await callExtendedPromise()).extendedPromise;
extendedPromise.on(); // 'on listener called'
extendedPromise.then(message => console.log(message)); // 'Hi!'