使用此代码:
fetch('notExists') // <---- notice
.then(
function(response)
{
alert(response.status)
}
)
.catch(function(err)
{
alert('Fetch Error : ', err);
});
此承诺解析。
它返回一个解析为对该请求的响应的promise, 是否成功。
失败的ajax请求即使转到不存在的资源也不是很奇怪吗?
我的意思是 - 下一步是什么?一个fetch
到服务器,它已经关闭并仍然得到解决的承诺?
我知道我可以在ok
对象的response
属性进行调查,但仍然 -
问题
为什么要为完全错误的请求(非现有资源)解析获取。
答案 0 :(得分:23)
仅当网络请求本身由于某种原因(未找到主机,没有连接,服务器没有响应等等)失败时,才会拒绝fetch()
呼叫。
从承诺的角度来看,从服务器(404,500等)返回的任何结果都被视为成功请求。从概念上讲,您是从服务器发出请求,服务器从网络角度对您做出了回应,请求已成功完成。
然后,您需要测试成功的响应,看看是否有您想要的答案类型。如果你想让404被拒绝,你可以自己编码:
fetch('notExists').then(function(response) {
if (response.status !== 200) {
// make the promise be rejected if we didn't get a 200 response
throw new Error("Not 200 response")
} else {
// go the desired response
}
}).catch(function(err) {
// some error here
});
您甚至可以自行创建myFetch()
,只为您自动执行此操作(将任何非200响应状态转换为拒绝状态)。
解决一个完全糟糕的承诺背后的原因是什么? 请求(非现有资源/服务器关闭)。
首先,服务器关闭不会生成成功的响应 - 这将拒绝。
如果您成功连接到服务器,向其发送请求并返回响应(任何响应),则会生成成功的响应。至于&#34;为什么&#34; fetch()
界面的设计者决定将拒绝作为基础,如果不与实际参与该界面设计的人交谈,说起来有点难,但这对我来说似乎是合乎逻辑的。这样拒绝就会告诉您请求是否通过并获得了有效的响应。由您的代码决定如何处理响应。当然,您可以创建自己的包装函数来修改默认行为。
答案 1 :(得分:1)
拒绝处理程序用于网络和CORS错误iirc。如果请求到达服务器并且它以有效的http响应进行响应,则即使响应是代码4xx或5xx,也会履行承诺。
答案 2 :(得分:0)
使用此代码...
fetch(`https://fercarvo.github.io/apps/integradora/DB/corpus.json`)
.then(async (data) => {
if (data.ok) {
data = await data.json()
//Here you have your data...
}
}).catch(e => console.log('Connection error', e))
答案 3 :(得分:0)
在@ fernando-caravajal示例的基础上构建(这使得异步/等待使用对我来说更容易),我在下面进行了此稍加修改的版本,用于后查询,并发送了参数。我添加了throw new Error
语句,因为我无法抓住response.ok == false
上的失败。
/**
* Generic fetch function
*/
function fetchData(url,parameters,callback) {
fetch(url,{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(parameters),
})
.then(async(response) => {
// status 404 or 500 will set ok to false
if (response.ok) {
// Success: convert data received & run callback
result = await response.json();
callback(result);
}
else {
throw new Error(response.status + " Failed Fetch ");
}
}).catch(e => console.error('EXCEPTION: ', e))
}