Catch UnhandledPromiseRejectionWarning во время получения - PullRequest
0 голосов
/ 27 июня 2018

У меня есть код:

function () {
  return new Promise((resolve, reject) => {
    try {
      fetch(URL, { method: METHOD, body: BODY })
        .then((res) => res.json())
        .then((json) => {
          resolve(json);
        })
        .catch((res) => {
          reject(res);
        })
    } catch (exception) {
      reject(exception);
    }
  });
}

Когда сервер отвечает не с помощью json, я получаю

UnhandledPromiseRejectionWarning: необработанное отклонение обещания. Эта ошибка возникла либо из-за того, что внутри асинхронной функции не был выполнен блок catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch ().

Я знаю, что try-catch не ловит асинхронные броски.

Я прочитал

Не удается поймать UnhandledPromiseRejectionWarning in обещание ,

Try Catch не удалось поймать UnhandledPromiseRejectionWarning ,

Ошибка «UnhandledPromiseRejectionWarning» даже при наличии перехвата

но нет ответа на мой вопрос.

1 Ответ

0 голосов
/ 27 июня 2018

Try catch не сможет обработать ошибку, которая генерируется асинхронно (т. Е. В обещании), для этого необходимо использовать .catch().

JSfiddle

function someFunc() {
    return new Promise((resolve, reject) => {

        fetch(URL, {method: METHOD, body: BODY})
            .then((res) => res.json())
            .then((json) => {
                resolve(json);
            })
            .catch((err) => {
                reject(err);
            })
    });
}

someFunc()
.then((value)=>{})
.catch((err)=>{console.log(err)})

Edit: Когда сервер отвечает без json, но с ошибкой, ваше возвращенное обещание будет rejected. Поэтому вы должны убедиться, что вы вызываете .catch() при вызове функции (то есть someFunc().catch(()=>{})). Эта ошибка появляется, если вы оставили необработанное обещание необработанным (без улова).

Edit2: Упс. Извините, неправильно прочитал ваш вопрос, но я думаю, что объяснение остается тем же. Если res не имеет метода json(), он вызовет следующую ошибку при вызове res.json() ::

Uncaught TypeError: res.json() is not a function

Этот error будет пойман вашим .catch() блоком. Теперь блок catch будет возвращать новое отклоненное обещание. При вызове функции и отсутствии catch() для обработки запроса будет выдана ошибка, о которой вы говорите.

Я объяснил немного больше здесь .

...