【问题标题】:Why does fetch return even after catching an error?为什么即使在捕获错误之后 fetch 也会返回?
【发布时间】:2019-07-29 09:58:31
【问题描述】:

我正在尝试编写一个通用的getData() 函数,我可以使用不同的 url 调用它,并在从服务器返回数据时采取不同的操作。

function getData(url){
        console.log("loading: " + url)
        return fetch(url)
            .then((response) => {
                console.log("received response")
                console.log(response.status)
                if(response.status >= 200 && response.status < 300)                 { 
                    console.log("url returned data...")
                    return response.json()
                } else {
                    console.log("url did not return data...")
                    throw new Error("The url did not return data")
                }
             })
             .catch((err) => {return err})
}
    
getData("notexisting.json")
         .then(data => console.log("success!!"))
         .catch(err => console.log("error!!"))

问题是这段代码sn-p即使url不存在也没有显示错误。另外,if 语句中的两个console.logs 永远不会到达,getData() 函数总是成功的......即使有错误......

【问题讨论】:

  • getData() 内部的.catch() 不会引发异常,因此不会调用 外部 函数的.catch() 调用。
  • 啊,当我用 throw err 替换 return err 时,它可以工作,谢谢!

标签: javascript ajax promise fetch


【解决方案1】:

您可以从getData 中删除catch 语句,它会按照您的预期工作

function getData(url){
        console.log("loading: " + url)
        return fetch(url)
            .then((response) => {
                console.log("received response")
                console.log(response.status)
                if(response.status >= 200 && response.status < 300)                 { 
                    console.log("url returned data...")
                    return response.json()
                } else {
                    console.log("url did not return data...")
                    throw new Error("The url did not return data")
                }
             })
}

getData("notexisting.json")
         .then(data => console.log("success!!"))
         .catch(err => console.log("error!!"))

// output is error!!

【讨论】:

  • 不,它总是返回成功,即使url不存在或有其他错误,控制台总是记录“成功!!”
  • 啊……太棒了!谢谢!
【解决方案2】:

来自文档:

从 fetch() 返回的 Promise 不会拒绝 HTTP 错误状态 即使响应是 HTTP 404 或 500。相反,它会解析 通常(ok状态设置为false),它只会拒绝 网络故障或是否有任何事情阻止请求完成。

参考:https://developer.mozilla.org/it/docs/Web/API/Fetch_API/Using_Fetch

我更喜欢使用像 Axios 这样的库,因为我更喜欢它与标准 fetch 的行为(无论如何都必须填充)。

【讨论】:

  • 这就是我包含if 语句的原因,以查看状态是否为OK/200,然后才继续执行代码。
猜你喜欢
  • 1970-01-01
  • 2018-05-13
  • 2012-07-14
  • 2017-10-01
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
相关资源
最近更新 更多