承诺链被拒绝但只有实施

时间:2017-08-14 09:02:47

标签: javascript promise fetch

我正在阅读有关承诺和获取的内容并且非常困惑。我从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);  
  });

2 个答案:

答案 0 :(得分:1)

在我试图理解承诺的早期,我认为.then链是两条链......成功和拒绝

拒绝或错误导致&#34;执行&#34;到&#34;跳&#34;从成功到拒绝

如果拒绝处理程序返回一个不被拒绝承诺的值,那么&#34;执行&#34;将&#34;跳跃&#34;成功链

注意:我对promises的最早曝光没有.catch ...因为.then实际上接受了两个参数onFullfilledonRejected - 如果其中任何一个不是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函数。