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”输出。