Вы правильно проверяете это в своем первом обработчике выполнения (then
обратный вызов), хотя я бы просто использовал !response.ok
. Обычно вам не нужен статус в последующих обработчиках.
Но проблема с вашим первым обработчиком выполнения заключается в том, что он ничего не возвращает, поэтому последующий обработчик выполнения видит только undefined
. Вместо этого верните обещание из json()
:
function f(path) {
fetch(path)
.then(response => {
if (!response.ok) {
// Note: Strongly recommend using Error for exceptions/rejections
throw new Error("HTTP error " + response.status);
}
return response.json();
})
.then(data => {
// ...use the data here...
})
.catch(error => {
// ...show/handle error here...
});
}
Обратите внимание, что вы не можете использовать await
в традиционной функции, только в функции async
. Но вам это не нужно, если вы используете .then
и .catch
. Я удалил его выше.
Если по какой-то причине вам нужен статус в последующих обработчиках выполнения, вам придется вернуть его из первого обработчика выполнения. Например:
function f(path) {
fetch(path)
.then(response => {
if (!response.ok) {
// Note: Strongly recommend using Error for exceptions/rejections
throw new Error("HTTP error " + response.status);
}
return response.json().then(data => ({status: response.status, data}));
})
.then(({status, data}) => {
// ...use `status` and `data` here...
})
.catch(error => {
// ...show/handle error here...
});
}
В этом случае я использовал вложенный обработчик выполнения для обещания из json()
, а затем вернул объект с status
и data
на нем.