在承诺链中返回多个值的最佳方式是什么

2022-02-24 00:00:00 return javascript promise

我确实意识到,在.Then()处理程序中返回非Promise时,它会立即传递到下一个处理程序,如果返回的是Promise,则在将其传递到下一个处理程序之前,会暂停执行以解析承诺。

我还知道承诺只能返回一个值。

蜜蜂说,我该如何着手将多个参数从一个.Then()处理程序返回到下一个处理程序?特别是如果它是承诺和非承诺的混合。目前,我将所有内容都放入一个自定义对象中,返回它,并在下面的Then()处理程序中使用异步等待,以便重新解析承诺。

然后使用已解析的承诺值和非承诺值一起执行某些工作。

这工作得很好,但我的直觉告诉我,不知何故,这不是它应该是的方式……也许?

示例:

const current = 'blah';
const previous = 'blubb';

this.doSomeAsyncWork()
.then(
    result => {
        const nonPromiseValue = new domSomethingSynchronous(current, previous);
        // "custom object, mix of promises and non-promises"
        return {
            nonPromise: nonPromise,
            promiseA: ControllerA.asyncOperationA(current, nonPromiseValue.someProperty),
            promiseB: ControllerB.asyncOperationB(nonPromiseValue.someOtherProperty),
        }
    }
)
.then(
    async x => {
        const nonPromiseValue = x.nonPromiseValue;
        const valueA = await x.promiseA;
        const valueB = await x.promiseB;

        // do something with the results of those three variables

    }
)
.catch(
    // ...
)


解决方案

在一个.then末尾的承诺和非承诺数组上使用return Promise.all,可以在下一个.then中立即解构结果,不需要await也不需要async

阵列中的所有Promises都已解析后,Promise.all将解析。传递给它的未承诺将仅传递给下一个.then

const makeProm = () => new Promise(resolve => setTimeout(resolve, 1000, 'resolveValue'));

Promise.resolve()
  .then(() => {
    const prom = makeProm();
    const otherValue = 'foo';
    return Promise.all([prom, otherValue]);
  })
  .then(([resolveValue, otherValue]) => {
    console.log(resolveValue, otherValue);
  });

相关文章