Skip to content

then方法总结 1 ​

本节目标:理解“then方法总结 1”的核心思路,并能把它用于实际开发或面试表达。 创建一个新的P,然后返回它; 然后在P的构造函数中,我们执行以下逻辑;

  • 实现透传
  • 当P的状态凝固时,我们立即调用成功回调和失败回调;
  • 当P的状态为pending时,我们将成功回调和失败回调放入回调函数数组中。

我们调用以及放入回调数组的成功和失败回调是经过包装过的,它做了以下处理:

  • 对回调函数调用的代码进行Try catch包装,以对回调函数执行时内部抛出的错误进行捕捉;比如finally的实现中,Promise.resolve(fn()),fn()内部抛出了一个错误;
  • 对成功回调函数和失败回调函数的返回值进行判断,是否是一个promise对象;
    • 如果是promise对象,则添加回调,并将状态值传递出来;
    • 如果不是,就直接resolve这个回调函数的返回值;

使用then方法意味着:

  • 给之前的期约添加回调函数;
  • then方法的两个参数即成功回调和失败回调,需要它之前的期约状态凝固时才会调用;
  • then方法会返回一个promise,因此可以链式调用,即then().then来添加回调函数;
  • then方法是执行成功还是失败回调,取决于它所订阅期约的状态;

then回调函数的执行逻辑 执行成功回调时:

  • 先看这个回调执行会不会报错,如果会报错,then所创建期约会reject,后续then的失败回调会执行;
  • 如果没有报错,我们取回调函数的执行结果,然后进行判断:
    • 如果不是期约,直接resolve这个执行结果;
    • 如果是期约,我们给这个期约添加回调函数,并且等待它的状态凝固;
      • 如果这个期约状态凝固为成功,then所创建的期约会resolve这个期约的成功值,,后续then的成功回调会执行;
      • 如果这个期约状态凝固为失败,then所创建的期约会reject这个期约的失败原因,,后续then的失败回调会执行;

执行失败回调时:

  • 如果没有定义失败回调,默认的失败回调为:err =\> { throw err },即抛出错误;
  • 先看这个回调执行会不会报错,如果会报错,then所创建期约会reject,后续then的失败回调会执行;
  • 如果没有报错,我们取回调函数的执行结果,然后进行判断:
    • 如果不是期约,直接resolve这个执行结果;
    • 如果是期约,我们给这个期约添加回调函数,并且等待它的状态凝固;
      • 如果这个期约状态凝固为成功,then所创建的期约会resolve这个期约的成功值,,后续then的成功回调会执行;
      • 如果这个期约状态凝固为失败,then所创建的期约会reject这个期约的失败原因,,后续then的失败回调会执行;

简言之,then在执行回调函数时,会检查回调函数的返回值,如果是期约,则等待它的状态凝固;并且在它所等待的期约状态成功时,将自身创建并要返回的期约状态改为成功,relove它所等待的期约的成功值;在它所等待的期约状态失败时,将自身创建并要返回的期约状态改为失败,reject它所等待的期约的失败原因;

由此可知,finally,catch等后面通过then添加的回调函数,都要finally和catch中定义的promise状态凝固才会执行;

  • 不管如何,要then()后面的then中的回调执行;我们要先将当前then的成功或失败回调执行完才行;有可能是立即执行的回调(订阅了一个状态立即凝固的promise),也有可能是异步执行的回调(订阅了一个状态为pending的promise);
  • 在执行then的成功或失败回调时,如果执行结果是一

本站总访问 — 次