.then((result1) => {
return result1;
})
не работает и должен быть опущен, но я полагаю, что в реальном коде нет этой проблемы.
Это вариант использования для функции async
, потому что они могут беспрепятственно обрабатыватьэтот вид потока управления, как предполагает другой ответ.Но поскольку async
является синтаксическим сахаром для необработанных обещаний, его можно записать на ES6.Поскольку задачи зависят от результатов друг друга, они не могут быть обработаны с помощью Promise.all
.
. Это тот же случай, что и , который использует async
.
Youможет выйти из цепочки обещаний, выдав исключение и избежав вложенных условий с помощью:
// should be additionally handled if the code is transpiled to ES5
class NoResultError extends Error {}
function getCurrentProcess(paramOne) {
doTask1()
.then(result1 => {
if (result1 !== 'OK') throw new NoResultError(1);
return result1;
})
.then(result1 => ({ result1, result2: doTask2(result1, paramOne) }))
.then(({ result1, result2 }) => {
if (result2 !== 'OK') throw new NoResultError(2);
return result1;
})
// etc
.then(() => {
return 'well done';
})
.catch(err => {
if (err instanceof NoResultError) return 'no result';
throw err;
})
}
Поскольку result1
используется в нескольких обратных вызовах then
, его можно сохранить в переменной, а не передавать черезЦепочка обещаний.
Цепочка обещаний могла бы стать проще, если бы в задачи были добавлены NoResultError
.