我正在阅读有关承诺和获取的内容并且非常困惑。我从Introduction to fetch获得了以下代码。
我的问题是:如果status
返回被拒绝的promise
会怎样? then(json)
被then(status)
后链接,这是否意味着then(json)
无法执行任何操作,因为then(json)
仅在status
返回已解决的承诺时执行?或者这是否意味着如果状态返回被拒绝的承诺,直到它到达底部的then
并且catch
捕获错误?
catch
s。
或者如果我错了,这段代码的正确解释是什么?
function status(response) {
if (response.status >= 200 && response.status < 300) {
return Promise.resolve(response)
} else {
return Promise.reject(new Error(response.statusText))
}
}
function json(response) {
return response.json()
}
fetch('users.json')
.then(status)
.then(json)
.then(function(data) {
console.log('Request succeeded with JSON response', data);
}).catch(function(error) {
console.log('Request failed', error);
});
答案 0 :(得分:1)
在我试图理解承诺的早期,我认为.then链是两条链......成功和拒绝
拒绝或错误导致&#34;执行&#34;到&#34;跳&#34;从成功到拒绝
如果拒绝处理程序返回一个不被拒绝承诺的值,那么&#34;执行&#34;将&#34;跳跃&#34;成功链
注意:我对promises的最早曝光没有.catch
...因为.then
实际上接受了两个参数onFullfilled
和onRejected
- 如果其中任何一个不是function
{1}}它会被忽略 -
因此,您的代码可以编写如下:
function status(response) {
if (response.status >= 200 && response.status < 300) {
return Promise.resolve(response)
} else {
return Promise.reject(new Error(response.statusText))
}
}
function json(response) {
return response.json()
}
function log(data) {
console.log(data);
}
function handleError(error) {
console.log('Request failed', error);
}
fetch('users.json')
.then(status, null)
.then(json, null)
.then(log, null)
.then(null, handleError);
现在很清楚,如果在功能统计中出现错误,那么&#34;就会被拒绝&#34;链在&#34;效果&#34; (我真的需要考虑更好的术语),并且在reject
链中没有任何内容,直到最底层,因此,下一个代码被执行
注意某些Promise库中的
.catch
只是以下
Promise.prototype.catch = function catch(onRejected) {
return this.then(null, onRejected);
};
答案 1 :(得分:0)
当一个承诺被拒绝时,它直接转到.catch()
而不执行其他任何链条。
因此,如果status
返回Promise.reject
,则只会执行catch
函数。