如何在解决时将其作为另一个承诺的结果返回Promise

时间:2018-02-06 15:50:32

标签: javascript node.js promise

这是一个示例代码:

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。扩展承诺的结构选择不是我在原始代码中的选择,而是从库中返回的结构。

1 个答案:

答案 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!'