【问题标题】:How to return a Promise as the result of another promise when it is resolved解决时如何将 Promise 作为另一个 Promise 的结果返回
【发布时间】:2018-07-16 17:52:27
【问题描述】:

这里是一个示例代码:

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 对象。

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

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

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

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

【问题讨论】:

  • 在顶部的 'gEP()' 中,尝试返回一些东西而不是 resolve 。 EX 返回另一个方法(异步),该方法解析为包含所需属性的对象。
  • getExtendedPromise() 是库的一部分,不开放修改。
  • @JoshLee 这个问题和我的问题和我看到的完全不同。
  • 使用 ad-hoc 方法装饰 Promise 的实用性非常有限,因为您已经发现 - 它充其量是空灵的。要问自己的真正问题是如何从代码库中清除对 .on() 的使用。

标签: javascript node.js promise


【解决方案1】:

很遗憾,可能无法从async 函数返回扩展的Promise。 (以下取自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!'

【讨论】:

  • 任何关于我可以做的任何黑客或补丁的想法来完成这项工作。我同意返回此结构的库很奇怪,但我无法切换到另一个库。
  • @AyushGupta 我刚刚编辑了问题以包含解决方法。
  • @PatrickRoberts 我同意这不是一个特别好的解决方案(我会进行编辑以反映这一点),但我不同意你的推理:我可以打电话给 extendedPromise.then(...) 并且有它使用此解决方案按预期解决。
猜你喜欢
  • 2023-03-31
  • 2019-09-17
  • 2019-10-10
  • 2016-10-03
  • 2017-10-24
  • 2019-08-03
  • 2020-08-06
  • 1970-01-01
  • 2018-04-18
相关资源
最近更新 更多