Как получить тело ответа и заголовки ответа в одном блоке

Я новичок в системе реагирования.Я отправляю запрос на сервер и хочу получить ответ и тело в том же блоке, чтобы я мог отправить оба элемента в другую функцию, мой метод выборки выглядит как

send_request = (data) =>{
  url = BASE_URL + "some/url.json"
  fetch(url, {
    method: 'POST',
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      user: {
        email: data.email,
        full_name: data.name,
      }
    })
  }).then((response) => {
    //how can I get response body here so that I can call following method
    // this.use_response(responsebody, response.headers)
    return response.json()
  }).then((responseJson) => {
    // or how can I get response headers here so that I can call following fuction
    // this.use_response(responseJson, headers)
    return responseJson
  }).catch((error) => {
    console.log(error)
  });
}

Как я могу использовать оба сразу, пожалуйста, помогите заранее спасибо!

5
0
4 545
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

response.headers - это объект, который доступен как есть, а request.json() - это обещание, которое необходимо выполнить.

Чтобы собрать их в одном месте с простыми обещаниями ES6, должны быть вложенные then:

  ...
  .then((response) => {
    return response.json().then(responseJson => {
      this.use_response(responseJson, response.headers)
    });
  })

Или несколько значений должны быть переданы через цепочку вместе как массив или объект:

  ...
  .then((response) => {
    return Promise.all([response.json(), response.headers]);
  }).then(([responseJson, headers]) => {
    this.use_response(responseJson, headers)
  })

Или, поскольку приложение React не ограничено ES5 / ES6 и может использовать все функции, которые поддерживает Babel, вместо него можно использовать async..await, который может решить такие проблемы естественным образом:

send_request = async (data) =>{
  url = BASE_URL + "some/url.json"
  const response = await fetch(url, {...})
  const responseJson = await response.json();
  this.use_response(responseJson, response.headers);
}

Самый простой способ, который я вижу, - это отправить заголовок функции send_request, а когда у вас есть ответ, оберните их в один объект и верните их.

Другие вопросы по теме