получать и асинхронно / ждать без попытки / поймать - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь заставить работать асинхронное ожидание без try / catch

  return await fetch(url, options)
    .then(res => res.json())
    .catch(err => {
      throw new Error(err)
    })

Вот как я делаю вызов:

    const response = await makeApiRequest('/reset', {
        password: password1,
        code
    }, {
        noauth: true
    }).catch(err => {
        debugger;
        msg = err.message;
    });

    if (response) {
        navigateTo('/');
    }

Проблема не в ловушкеблоки работают. Код истек и обслуживает 401.

1 Ответ

0 голосов
/ 24 октября 2019

Fetch API не работает, только если он не может сделать запрос. И если это возможно, выборка будет выполнена успешно, даже если у нее плохой статус.

Поскольку throw new Error(err) никогда не вызывался, это будет просто вызов, когда вы попытаетесь проанализировать invalid string content для объекта json (res.json()). Я в гостях, в 401 случае ваш сервер возвращает допустимую строку json, такую ​​как {message: "Unauthorized"}, затем res.json() работает нормально, и не было ошибок, как throw.

Если вы хотите отловить ошибку http, тогдаhttp status code из res объект является правильным способом:

  return await fetch(url, options)
    .then(res => {
      if (res.status >= 300) { // error http status code range
        throw new Error(res.status) // throw a error to the catch block
      }
      return res.json();
    })
    .catch(err => {
      throw new Error(err) // catch and throw to the error of previous `.then` block
    })

Затем повторите попытку.

...