https://segmentfault.com/a/1190000016550260
// 谈到Promise,在看原理之前我们先看官方提供的方法 写一个小的demo
// const promiseAjax = new Promise((resolve, reject) => {
// setTimeout(()=>{
// resolve({"status":0,"data":[1,2,3,4]});
// },1000)
// });
// promiseAjax.then((res)=>{
// console.log("res-->",res)
// })
// Promise 有限状态机 有3个状态来回的切换 pending fulfilled rejected
// 如何实现异步的 3状态切换。 就是我then 的事情往事件存储中心存下信息。
// 当resolve。或者reject的时候,我再去我的事件中心去遍历的的fn 并变更我的状态
// 实现方法 先同步、再异步
// 同步
const PENDING = "pending";
const FULFILLED ="fulfilled";
const REJECTED = "rejected";
function MyPromise (executor){
let self = this;
self.state = PENDING;
self.value = null;
self.reason = null;
self.successCBArr =[];
self.rejectCBArr =[];
function resolve(value){
if(self.state == PENDING){
self.state = FULFILLED;
self.value = value;
self.successCBArr.forEach(successFn=>successFn())
}
}
function reject(err){
if(self.state == PENDING){
self.state = REJECTED;
self.reason = err;
self.rejectCBArr.forEach(rejectFn=>rejectFn())
}
}
try{
executor(resolve,reject);
} catch(err){
reject(err)
}
}
MyPromise.prototype.then = function(onSuccessCB,onRejectCB){
let self = this;
if(self.state == PENDING){
self.successCBArr.push(()=>{
onSuccessCB(self.value);
})
self.rejectCBArr.push(()=>{
onSuccessCB(self.reason);
})
}
if (self.state === FULFILLED) {
onSuccessCB(self.value);
}
if (self.state === REJECTED) {
onRejectCB(self.reason);
}
}
// 还差一步。 then 之后返回的还是promise 写不动了。看博客链接吧;
const MyPromiseAjax = new MyPromise((resolve, reject) => {
setTimeout(()=>{
resolve({"status":0,"data":[1,2,3,4]});
},1000)
});
MyPromiseAjax.then((res)=>{
console.log("res-->",res)
})
//== promise all 的实现原理