深入学习Promise A+规范之Promise解决过程

291 阅读2分钟

接着上篇Promise A+规范基础介绍,继续学习Promise解决过程:

Promise 解决过程具体过程如下图所示, image.png

具体执行如下:

运行 [[Resolve]](promise2, x) 需遵循以下步骤:

  • x 与 promise2 相等

var promise1 = new Promise((resolve, reject) => {
    resolve('promise1 resolve ok~');
});

// return x
var promise2 = promise1.then((value) => {
    //1 promsie 与 x 相等
    x = promise2;
    return x;
})   

image.png

  • x 为 Promise

比如:x为promise1,则then返回的promise2的状态又promise1决定~

var promise1 = new Promise((resolve, reject) => {
    resolve('promise1 resolve ok~');
});

// return x
var promise2 = promise1.then((value) => {
    //x为promise1
    x = promise1;
    return x;
})  

image.png

  • x 为对象或函数

(1)、x,为对象,且存在then熟悉,把 x.then 赋值给 then, 如果取 x.then 的值时抛出错误 e ,则以 e 为据因拒绝 promise;

如果x.then是函数,将 x 作为函数的作用域 this 调用之,传递两个回调函数作为参数,第一个参数叫做 resolvePromise ,第二个参数叫做 rejectPromise:

  • 如果 resolvePromise 以值 y 为参数被调用,则运行 [[Resolve]](promise, y)

  • 如果 rejectPromise 以据因 r 为参数被调用,则以据因 r 拒绝 promise

  • 如果 resolvePromise 和 rejectPromise 均被调用,或者被同一参数调用了多次,则优先采用首次调用并忽略剩下的调用

  • 如果调用 then 方法抛出了异常 e

    • 如果 resolvePromise 或 rejectPromise 已经被调用,则忽略之
    • 否则以 e 为据因拒绝 promise
  • 如果 then 不是函数,以 x 为参数执行 promise


var promise1 = new Promise((resolve, reject) => {
   resolve('promise1 resolve ok~');
  });

// return x
var promise2 = promise1.then((value) => {
   //
   x = {
      name: 'linklogis',
      age: 6,
       // then是函数,将 `x` 作为函数的作用域 `this` 调用之
       // 传递两个回调函数作为参数,第一个参数叫做 `resolvePromise` ,第二个参数叫做 `rejectPromise`:
      then(resolvePromise, rejectPromise) {
       resolve(this.name)
      }
   };
   return x;
})  

运行结果:

image.png

(2)、 如果 x 不为对象或者函数,以 x 为参数执行 promise

 var promise1 = new Promise((resolve, reject) => {
    resolve('promise1 resolve ok~');
});

// return x
var promise2 = promise1.then((value) => {
    //
    x = {
        name: 'linklogis'
    };
    return x;
}) 

运行结果:

image.png

接下来将实现手写Promise