fetch response.json() и response.status
Это единственный способ использовать body.json(), а также получить код состояния?
let status;
return fetch(url)
.then((response => {
status = response.status;
return response.json()
})
.then(response => {
return {
response: response,
status: status
}
});
Это не работает, так как возвращает обещание в поле ответа:
.then((response)=> {return {response: response.json(), status: response.status}})
Ответы
Ответ 1
then
ваш статус не отображается во втором. Вы можете просто получить два свойства в единственном then
.
json()
возвращает новый посыл к вам, так что вам нужно создать объект внутри, then
в результате этой функции. Если вы вернете обещание из функции, оно будет выполнено и вернет результат выполнения - в нашем случае объект.
fetch("https://jsonplaceholder.typicode.com/posts/1")
.then(r => r.json().then(data => ({status: r.status, body: data})))
.then(obj => console.log(obj));
Ответ 2
На прошлой неделе я столкнулся с той же проблемой. Метод .json
возвращает обещание JSON, а не самому JSON. Если вы хотите сразу получить как ответ, так и JSON, вам нужно использовать вложенные блокировки следующим образом:
fetch(...)
.then(response => {
response.json().then(json => {
// code that can access both here
})
})
Поскольку обратный вызов, переданный в обещание json
был создан в обратном вызове к обещанию fetch
, он также получит доступ к response
.
Возможно, вы захотите создать функцию, которая обрабатывает JSON и ошибки, а затем повторно использовать ее для всех ваших наборов. Например, что-то вроде этого:
function fetchHandler(response) {
if (response.ok) {
return response.json().then(json => {
// the status was ok and there is a json body
return Promise.resolve({json: json, response: response});
}).catch(err => {
// the status was ok but there is no json body
return Promise.resolve({response: response});
});
} else {
return response.json().catch(err => {
// the status was not ok and there is no json body
throw new Error(response.statusText);
}).then(json => {
// the status was not ok but there is a json body
throw new Error(json.error.message); // example error message returned by a REST API
});
}
}
Ответ 3
Вы попробовали это?
return fetch(url)
.then((r)=> {return {response: r.json(), status: r.status}})
Ответ 4
Я думаю, что самый простой способ - создать Promise.all() с нужными вам кусочками.
.then(response => Promise.all([Promise.resolve(response.ok), response.text()]))
Который можно записать короче как
.then(response => Promise.all([response.ok, response.text()]))
Обещание возвращает массив со всеми результатами
.then(data => ({ status: data[0], response: data[1] }))