美文网首页
fetch,promise and handling error

fetch,promise and handling error

作者: meteornnnight | 来源:发表于2019-08-12 21:16 被阅读0次

1. 基于callbackXMLHttpRequest处理http请求

a simple XMLHttpRequest example from MDN:

function reqListener(){
  console.log(this.responseText);
}
var oReq=new XMLHttpRequest();
oReq.addEventListener('load',reqListener);
oReq.open('GET','http://www.example.org/example.txt');
oReq.send();

2. 基于promisefetch处理http请求

fetch API 能够帮助我们不用记住xhr那么多的callback函数,一个基本的用法如下:

fetch('myResource.json').then(function(response) {
  return response.json();
}).then(function(parsedJson) {
  console.log('This is the parsed json', parsedJson);
})

很明显,这是一个promise chain

  • fetch返回一个valueresponse objectresolved promise;
  • response object调用Body.json()函数,返回一个新的promise,这个promiseresolve之后,返回的value值为resulting json.

一个比较复杂的应用场景:用fetch得到user信息之后,在当前页面显示其github主页的头像:

fetch('./infos/user.json')
.then(response=>response.json())
.then(user=>fetch(`https://api.github.com/users/${user.name}`))
.then(response=>response.json())
.then(githubUser => new Promise(function(resolve, reject) {
    let img = document.createElement('img');
    img.src = githubUser.avatar_url;
    img.className = "promise-avatar-example";
    document.body.append(img);
    setTimeout(() => {
      img.remove();
      resolve(githubUser);
    }, 3000);
  })
)
.then(githubUser => alert(`Finished showing ${githubUser.name}`));

时刻记住,.then会返回promise对象:

3种情况

3. Promise处理error

基本的概念梳理:

  • executor或者.then() handler里面不管主动throw error还是代码出现了runtime error,两者都是等效的。
    (因为promise自带隐形的try...catch)
  • 两者都会导致 return rejected promise, 返回的value值是error

一旦出现了error, promise rejected, 我们当然可以在.catch中处理。

3.1 rethrow error

// 执行:catch -> then
new Promise((resolve, reject) => {

  throw new Error("Whoops!");

}).catch(function(error) {

  alert("The error is handled, continue normally");

}).then(() => alert("Next successful handler runs"));

上述代码中的catch handler处理了error之后,返回一个resolved promise, valueundefined, js引擎继续执行下面这个then handler
现在让我们终于进入正题,我们怎么样在fetch请求中利用rethrow和promise处理error机制来更好地处理error呢?

class HttpError extends Error{
  constructor(response){
    super(`${response.status} for ${response.url}`);
    this.name='HttpError';
    this.response=response;
  }
}

我们定义了一个自己的Error class: HttpError, 下面我们就在自己的代码中使用它。

loadJson(url){
  return fetch(url)
  .then((response)=>{
    if (response.status == '200'){  
      response.json();
      }
    else{
      throw new HttpError(response);
    }
  });
}
//using HttpError in a case below:
function githubUser(){
  let name=prompt('Enter a name:', 'emma');
   return loadJson(`https://github.com/users/${name}`)
  .then((user)=>{
  console.log(user.name);
  return user;
  })
  .catch(error()=>{ (*)
    if(error instance of HttpError && error.response.status == '404'){
      console.log('No such user, please re-enter.');
      return githubUser();
    }else{
      throw(error); (**)
    }
  })
}

如果在(*)处的catch handler中,我们发现error不是HttpError, 那么我们就认定这个handler无法处理这个error,rethrow it (**).
在全局环境中,增加一个eventListener

window.addEventListener('unhandledrejection',()=>{});

相关文章

网友评论

      本文标题:fetch,promise and handling error

      本文链接:https://www.haomeiwen.com/subject/todujctx.html