返回

Promise.reject

前端

当然,让我们来梳理下reject决策:

首先我们来看看reject调用栈:

Promise.reject = function(arg) {
  return new Promise(function(resolve, reject) {
    reject(arg);
  });
};

这里其实和resolve的函数很像,只不过reject将回调函数的reject参数调用了。

const p1 = Promise.reject(42);
p1.then(undefined, function(reason) {
  console.log(reason); // 42
});

因为reason的传入,此时p1.state为"rejected",所以调用了onRejected的回调。

我们再来看下它所对应的流程:

var p2 = new Promise(function(resolve, reject) {
  // 异步执行了一些任务
  reject(42);
});

p2.then(undefined, function(reason) {
  console.log(reason); // 42
});

由于reject方法是在构造函数里直接调用的,所以此时的p2.state也是"rejected",当然也执行了onRejected回调。

所以一般我们建议,执行reject的时候,把第一个参数是错误类型,第二个参数是错误信息:

function ajax(url) {
  return new Promise((resolve, reject) => {
    // 利用 fetch 发起异步请求
    fetch(url)
      .then(res => {
        if (res.ok) {
          resolve(res.json());
        } else {
          reject({
            errorType: res.status,
            errorMessage: res.statusText,
          });
        }
      })
      .catch(err => {
        reject({
          errorType: 'NetworkError',
          errorMessage: err.message,
        });
      });
  });
}

如此一来,在使用上也更为方便,直接获取这两个参数:

ajax('http://example.com/api/users')
  .then(undefined, ({ errorType, errorMessage }) => {
    console.log(errorType, errorMessage);
  });