Promise

Promise

Promise 必须为以下三种状态:等待态(Pending)、执行态(Fulfilled)和拒绝态(Rejected)。一旦 Promise 被 resolve 或 reject,不能再迁移至其他任何状态(即状态 immutable)。

基本过程:

  1. 初始化 Promise 状态(pending)
  2. 立即执行 Promise 中传入的 fn 函数,将 Promise 的内部 resolve,reject 函数作为参数传递给 fn,按事件机制时机处理
  3. 执行 then(.then)注册回调处理数组(then 方法可被同一个 Promise 调用多次)
  4. Promise 里的关键是要保证.then 方法传入的参数 onFulfilled 和 onRejected,必须在 then 方法被调用的那一轮事件循环之后的新执行栈中执行。

真正的链式 Promise 是指在当前 promise 达到 fulfilled 状态后,即开始进行下一个 promise

链式调用

new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve({ test: 1 });
    resolve({ test: 2 });
    reject({ test: 2 });
  }, 1000);
})
  .then(
    (response) => {
      console.log('result1', data);
    },
    (error) => {
      console.log('result2', data1);
    }
  )
  .then((response) => {
    console.log('result3', data);
  });
//result1 { test: 1 }
//result3 undefined

显然这里输出了不同的 data。由此可以看出几点:

  1. 可进行链式调用,且每次 then 返回了新的 Promise(2 次打印结果不一致,如果是同一个实例,打印结果应该一致。
  2. 只输出第一次 resolve 的内容,reject 的内容没有输出,即 Promise 是有状态且状态只可以由 pending -> fulfilled 或 pending-> rejected,是不可逆的。
  3. then 中返回了新的 Promise,但是 then 中注册的回调仍然是属于上一个 Promise 的。

Promise 的立即执行性

var p = new Promise(function (resolve, reject) {
  console.log('create a promise');
  resolve('success');
});

console.log('after new Promise');

p.then(function (value) {
  console.log(value);
});
//控制台输出
('create a promise');
('after new Promise');
('success');

Promise 对象表示未来某个将要发生的事件,但在创建(new)Promise 时,作为 Promise 参数传入的函数是会被立即执行的,只是其中执行的代码可以是异步代码。因此,代码中”create a promise”先于”after new Promise”输出。