gpt4 book ai didi

javascript - 如何在解决后返回一个 Promise 作为另一个 promise 的结果

转载 作者:搜寻专家 更新时间:2023-11-01 00:36:50 25 4
gpt4 key购买 nike

这里是一个示例代码:

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 中,并将其返回给调用者,因为我希望调用者通过 on 获取 Promise 对象属性(property)。

但是,当调用 callExtendedPromise() 时,我无法使用 on 属性访问包装的 promise 。

如何使用 on 属性获取 promise 实例?

getExtendedPromise() 是库的一部分,不可修改。

P.S. extended promise 的结构选择不是我在原始代码中选择的,而是从库返回的结构。

最佳答案

不幸的是,可能无法从 async 函数返回扩展的 Promise。 (以下摘自async function on MDN)

...the return value of an async function is implicitly wrapped in 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!'

关于javascript - 如何在解决后返回一个 Promise 作为另一个 promise 的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48646890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com