Я действительно понимаю, что при возвращении не-обещания в обработчике.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(
// ...
)
Используйте 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);
});
Promise.all
будет тем же элементом (или Обещанием, которое разрешается), индексом 1 в следующем массиве.then