Promise的done方法实现里面,setTimeout是什么作用?

代码如下:

Promise.prototype.done = function (onFulfilled, onRejected) {
  this.then(onFulfilled, onRejected)
    .catch(function (reason) {
      // 抛出一个全局错误
      setTimeout(() => { throw reason }, 0);
    });
};

最佳答案

这个你要和 catch 函数一起理解,任何的 catch 实现都会包一层 try-catch ,如果你这里直接抛错误,就会直接被 catch 掉,不能抛出去,所以需要包一个 settimeout 来达到目的,至于为什么异步函数错误不会被当前 try-catch 捕捉,那是因为异步函数的实际上不在当前的执行队列里,而是会放在后面,所以当前的 try-catch 无法捕捉到。