JS Promise 理解

    const p = new Promise((resolve, reject) => {
      console.log('create new promise');
      try {   //异步执行
        this.ljccc(); //未定义,抛出异常,转而执行reject
      } catch (err) {
        reject('error');
      }
    });
    console.log('after new  promise');

    p.then((value) => {
      console.log(value);
    }).catch((err) => {
      console.log(err);  //获取上面reject中的error,并打印出来。
    });

上面的执行结果是:

create new promise

after new  promise

error                        --------异步执行reject

const p = new Promise((resolve, reject) => {
      console.log('create new promise');
      try {      //异步执行
        resolve('success');
      } catch (err) {
        reject('error');
      }
    });
    console.log('after new  promise');

    p.then((value) => {
      console.log(value); //获取上面resolve中的success,并打印出来
    }).catch((err) => {
      console.log(err);
    });

上面的执行结果是:

create new promise

after new  promise

success --------异步执行resolve

所谓Promise,字面上可以理解为“承诺”,就是说A调用B,B返回一个“承诺”给A,然后A就可以在写计划的时候这么写:当B返回结果给我的时候,A执行方案S1,反之如果B因为什么原因没有给到A想要的结果,那么A执行应急方案S2,这样一来,所有的潜在风险都在A的可控范围之内了。

Promise规范如下:

  • 一个promise可能有三种状态:等待(pending)、已完成(fulfilled)、已拒绝(rejected)
  • 一个promise的状态只可能从“等待”转到“完成”态或者“拒绝”态,不能逆向转换,同时“完成”态和“拒绝”态不能相互转换
  • promise必须实现then方法(可以说,then就是promise的核心),而且then必须返回一个promise,同一个promise的then可以调用多次,并且回调的执行顺序跟它们被定义时的顺序一致
  • then方法接受两个参数,第一个参数是成功时的回调,在promise由“等待”态转换到“完成”态时调用,另一个是失败时的回调,在promise由“等待”态转换到“拒绝”态时调用。同时,then可以接受另一个promise传入,也接受一个“类then”的对象或方法,即thenable对象。

Promise实现的大致原理思路如下:

  构造函数Promise接受一个函数resolver,可以理解为传入一个异步任务,resolver接受两个参数,一个是成功时的回调,一个是失败时的回调,这两参数和通过then传入的参数是对等的。

其次是then的实现,由于Promise要求then必须返回一个promise,所以在then调用的时候会新生成一个promise,挂在当前promise的_next上,同一个promise多次调用都只会返回之前生成的_next。

由于then方法接受的两个参数都是可选的,而且类型也没限制,可以是函数,也可以是一个具体的值,还可以是另一个promise。


猜你喜欢

转载自blog.csdn.net/robinson_911/article/details/80677409