Как остановить выполнение следующей функции с async-await?
Я использую эту библиотеку для объединения асинхронных функций в моем приложении nodejs: https://github.com/yortus/asyncawait
var chain = async(function(){
var foo = await(bar());
var foo2 = await(bar2());
var foo3 = await(bar2());
}
Таким образом, bar3 ожидает завершения bar2, а bar2 ожидает завершения bar(). Все в порядке. Но что я буду делать, чтобы остановить асинхронный блок от дальнейшего выполнения? Я имею в виду что-то вроде этого:
var chain = async(function(){
var foo = await(bar());
if(!foo){return false;} // if bar returned false, quit the async block
var foo2 = await(bar2());
var foo3 = await(bar2());
}
Каков наилучший способ справиться с этим?
на данный момент я выкидываю исключение в пределах бара и обрабатываю исключение следующим образом:
chain().catch(function (err) { //handler, ie log message)
Это работает, но выглядит не так
2 ответа
Я имею в виду что-то вроде этого...
asyncawait поддерживает именно этот синтаксис. Просто return
из функции:
var chain = async(function(){
var foo = await(bar());
if (!foo) return;
var foo2 = await(bar2());
var foo3 = await(bar2());
});
В качестве альтернативы принятому ответу и в зависимости от вашего использования вы можете захотеть
bar()
с к
throw
/отклонять.
async function bar() {
try {
Api.fetch(...) // `fetch` is a Promise
} catch (err) {
// custom error handling
throw new Error() // so that the caller will break out of its `try`
// or re-throw the error that you caught, for the caller to use
throw err
}
// or, instead of a try/catch here, you can just return the Promise
return Api.fetch(...)
}
var chain = async(function(){
try {
// if any of these throw or reject, we'll exit the `try` block
var foo = await(bar());
var foo2 = await(bar2());
var foo3 = await(bar2());
} catch {} // ES2019 optional catch. may need to configure eslint to be happy
});