Promise
Promise
Promise 必须为以下三种状态:等待态(Pending)、执行态(Fulfilled)和拒绝态(Rejected)。一旦 Promise 被 resolve 或 reject,不能再迁移至其他任何状态(即状态 immutable)。
基本过程:
- 初始化 Promise 状态(pending)
- 立即执行 Promise 中传入的 fn 函数,将 Promise 的内部 resolve,reject 函数作为参数传递给 fn,按事件机制时机处理
- 执行 then(.then)注册回调处理数组(then 方法可被同一个 Promise 调用多次)
- 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。由此可以看出几点:
- 可进行链式调用,且每次 then 返回了新的 Promise(2 次打印结果不一致,如果是同一个实例,打印结果应该一致。
- 只输出第一次 resolve 的内容,reject 的内容没有输出,即 Promise 是有状态且状态只可以由 pending -> fulfilled 或 pending-> rejected,是不可逆的。
- 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”输出。