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] }))