Каков наилучший способ вернуть несколько значений в цепочке обещаний?

1

Я действительно понимаю, что при возвращении не-обещания в обработчике.then() он немедленно передается следующему обработчику, если он возвращает обещание, выполнение приостанавливается для обещания разрешить, прежде чем оно будет передано на следующий обработчик.

Также я знаю, что из обещания может быть возвращено только одно значение.

Как я сказал, как бы я мог возвратить несколько параметров из одного.then() обработчика в следующий? Esepcailly, если это сочетание обещаний и не обещаний. В настоящее время я помещаю все в пользовательский объект, возвращаю его и использую async в следующем обработчике 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(
    // ...
)
Теги:
promise
return

1 ответ

3
Лучший ответ

Используйте return Promise.all в массиве Promises и non-Promises в конце. .then, а затем вы можете немедленно разрушить результаты в следующем. .then, no await и async.

Promise.all решит, как только все Promises в массиве будут решены. Не-Обещание, переданное ему будет просто переходят к следующему .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);
  });
  • 0
    Благодарю. Будет ли каждый элемент в массиве Promise.all ([]) сохранять свой индекс? Например, если у меня есть 3 обещания [prom1, prom2, prom3, nonProm] и prom3 разрешаются до Prom1, будет ли Prom3 иметь индекс 2?
  • 1
    Да, соответствующий индекс каждого элемента будет сохранен. Индекс 1 в массиве, переданном в Promise.all будет тем же элементом (или Обещанием, которое разрешается), индексом 1 в следующем массиве .then

Ещё вопросы

Сообщество Overcoder
Наверх
Меню