JavaScript获取response.status或response.text(),但不能同时获取两者

f3temu5u  于 2023-01-11  发布在  Java
关注(0)|答案(4)|浏览(362)

我有两个fetch脚本,它们在或上都很好用,尽管我不知道如何合并它们。
第一个例子让我知道了response.status是什么,尽管它知道服务器的HTTP响应,但没有响应正文(是的,异步):

fetch(url).then(function(r)
{
 if (r.status != 200) {alert('Error: unable to load preview, HTTP response '+r.status+'.');}
 else
 {
  console.log(r.text());//Promise { <state>: "pending" }, no good.
 }
}).catch(function(err) {alert('Error: '+err);});

第二个脚本允许我访问response.text(),尽管我没有访问response.status的权限:

fetch(url).then(r => r.text()).then(function(r)
{
 console.log(r);//response text.
});

如何正确合并脚本,以便在收到请求 * 后 * 能够访问response.statusresponse.text()

ckocjqey

ckocjqey1#

fetch("https://api.thecatapi.com/v1/images/search").then(function(r)
    {
     if (r.status != 200) {
        alert('Error: unable to load preview, HTTP response '+r.status+'.');
      return
     }
     r.text().then(txt => console.log(txt))
    }).catch(function(err) {alert('Error: '+err);});

你可以这样做;需要先解决承诺,然后才能访问值
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

62lalag4

62lalag42#

您可以使用Promise.all,它允许您在fetch返回一个承诺的同时处理多个承诺。

const firstFetch = fetch(url);
const secondFetch = fetch(url);

Promise.all([firstFetch, secondFetch]).then(([firstResponse, secondResponse]) => {
   // Here you can have access to both firstResponse.status

   // And secondResponse.text
    
})
r6l8ljro

r6l8ljro3#

虽然@shubhan的代码可以正常工作,但一个更干净的方法可能是内置的承诺链,以避免回调地狱,这是承诺努力解决的问题:

fetch(url)
  .then(response => {
    if (response.status >= 400) throw { code: response.status }
    return response.text() // if you return a promise in a `then` block, the chained `then` block will get the resolved result
  })
  .then(text => {
    console.log(text)
    // handle successful event
  })
  .catch(err => {
    // if at any stage of the promise chain, if a promise rejects, or throws, it will be caught by the `catch` block
    if (err.code) {
      // handle status error
    } else {
      // handle other errors
    }
  })
ny6fqffe

ny6fqffe4#

谢谢

fetch("https://api.thecatapi.com/v1/images/search").then(function(r)
    {
     if (r.status != 200) {
        alert('Error: unable to load preview, HTTP response '+r.status+'.');
      return
     }
     r.text().then(txt => console.log(txt))
    }).catch(function(err) {alert('Error: '+err);});

相关问题