Как остановить выполнение следующей функции с 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
});
Другие вопросы по тегам