react-native fetch 返回状态码+json

问题描述 投票:0回答:2

我在react-native中使用fetch来进行API调用。

我需要获取状态代码(200、401、404)和响应数据。

这项工作是为了获取响应数据:

return fetch(url)
.then(response => {
  return response.json();
})
.then(res => {
  console.log("reponse :", res); // <-------- res is ok with data
 })    .catch(error => {
  console.error(error);
  return { name: "network error", description: "" };
});

现在我调整第一个然后以获得状态代码,但数据不是我所除外的

return fetch(url)
.then(response => {
  const statusCode = response.status;
  const data = response.json();
  return { statusCode, data };
})
.then(res => {
  console.log("reponse :", res); // <-------- i get a "promise"
 }).catch(error => {
  console.error(error);
  return { name: "network error", description: "" };
});

控制台日志:

  {statusCode: 200, data: Promise}
react-native promise fetch-api
2个回答
30
投票

response.json()
返回一个承诺,你应该等待它被履行。为此,您可以将
Promise.all
与两个元素的数组一起使用:
statusCode
response.json()
调用:

return fetch(url)
  .then(response => {
    const statusCode = response.status;
    const data = response.json();
    return Promise.all([statusCode, data]);
  })
  .then(([res, data]) => {
    console.log(res, data);
  })
  .catch(error => {
    console.error(error);
    return { name: "network error", description: "" };
  });

//编辑 您可以创建一个处理响应的函数

function processResponse(response) {
  const statusCode = response.status;
  const data = response.json();
  return Promise.all([statusCode, data]).then(res => ({
    statusCode: res[0],
    data: res[1]
  }));
}

并使用 then()

 return fetch(url)
    .then(processResponse)
    .then(res => {
        const { statusCode, data } = res;
        console.log("statusCode",statusCode);
        console.log("data",data);
    }) .catch(error => {
    console.error(error);
    return { name: "network error", description: "" };
  });

3
投票

因为第一个

then
中API的响应是一个字符串而不是对象,所以你不能像
response.status
那样使用响应。您应该首先将响应转换为 JSON 对象,然后像第一个示例一样将状态用作
response.status
。该代码应该可以正常工作:

return fetch(url)
.then(response => {
  const statusCode = response.status;
  let data;
  response.json().then(obj=>{
    data= obj;
    return { statusCode, data };
  });

})
.then(res => {
  console.log("reponse :", res); // <-------- i get a "promise"
 }).catch(error => {
  console.error(error);
  return { name: "network error", description: "" };
});
© www.soinside.com 2019 - 2024. All rights reserved.