Как правильно использовать функцию try/catch, promise catch и async?

Вот как моя функция загрузки выглядит на данный момент. Я использую мутацию аполлона для загрузки файла.

Я не понимаю, как правильно использовать try/catch и catch обещания (которым является client.mutate()). Также я объявил функцию загрузки как async.

Так что, видимо, я что-то путаю :-(

Как правильно ловить ошибки?

Мне нужны оба улова? Разве я не должен заменить try/catch, если я использую асинхронную функцию?

export default async function upload (client) {
  try {
    return client.mutate({
      mutation: uploadsMutation
    }).catch(err => {
      console.error(err)
    })
  } catch (error) {
    Alert.alert('Error', 'Could not upload files')
  }
}

person user3142695    schedule 30.04.2018    source источник
comment
Взгляните на stackoverflow.com /вопросы/44663864/   -  person Bergi    schedule 30.04.2018
comment
Нет, вам не понадобился бы вызов .catch(), если бы вы использовали await   -  person Bergi    schedule 30.04.2018
comment
@Bergi Разве return не ведет себя как await?   -  person user3142695    schedule 30.04.2018
comment
Не внутри блока try   -  person Bergi    schedule 30.04.2018


Ответы (1)


async и await должны использоваться рука об руку - это означает, что ничего не "ожидается" автоматически без использования ключевого слова await. В вашем примере вы просто возвращаете обещание, возвращенное из client.mutate.

export default async function upload (client) {
  try {
    return await client.mutate({
      mutation: uploadsMutation
    });
  } catch (error) {
    Alert.alert('Error', 'Could not upload files')
  }
}

Имейте в виду, что ваша функция upload также возвращает обещание, будучи async. Поэтому вызывающий код должен обрабатывать это соответствующим образом.

person Flowers4Life    schedule 30.04.2018
comment
FWIW вам не нужно использовать await внутри функции async. Вернуть обещание напрямую было бы хорошо, но, конечно, тогда try...catch не работает, и не было бы смысла делать функцию async, но это нормально. - person Felix Kling; 30.04.2018
comment
Вы абсолютно правы, я обычно делаю функции async только для того, чтобы обозначить, что они возвращают обещание, которое потенциально может быть сгенерировано ниже. Отредактировал ответ, уточнив это. - person Flowers4Life; 30.04.2018
comment
Правильно ли я вас понимаю, что я должен просто вернуть промис и запустить try/catch в том месте, где я вызываю функцию загрузки? - person user3142695; 30.04.2018
comment
Вы можете, если это подходит для вашего использования. В вашем примере речь шла об обработке его непосредственно в функции upload. Если вы сделаете это, вызывающий код должен будет await upload(client);. - person Flowers4Life; 30.04.2018