⼿写promi(⾯试版)
(function(){
"u strict";
function Promi(executor){
var lf =this;
if(typeof executor !=="function")throw new TypeError("Promi resolver is not a function");
if(!(lf instanceof Promi))throw new TypeError("undefined is not a promi");
价值决定价格
// 实例默认具备两个属性:state状态 result值
lf.state ="pending";
// 修改实例的状态和值
var change=function change(state, result){
校本培训内容
// 状态⼀但不是pending,则不能再修改了
if(lf.state !=="pending")return;坠兔收光
lf.state = state;有诗意的句子
// 通知事先存储好的⽅法执⾏「根据修改后的状态,找到指定的集合再去执⾏」
tTimeout(function(){
var callbacks = state ==="fulfilled"? lf.onFulfilledCallbacks : lf.onRejectedCallbacks;
if(callbacks.length >0){
for(var i =0; i < callbacks.length; i++){
var item = callbacks[i];
if(typeof item ==="function")sult);
}
}
});
};
// ⽴即执⾏executor函数
try{
executor(function resolve(value){
change("fulfilled", value);
},function reject(reason){
change("rejected", reason);
});
}catch(err){
// 执⾏executor报错,也是把实例的状态改为失败
change('rejected', err);
}
}
Promi.prototype ={
新店constructor: Promi,
then:function then(onfulfilled, onrejected){
var lf =this;
// 知道实例的状态和不知道状态要做不同的事情
switch(lf.state){
ca"fulfilled":
tTimeout(function(){
sult);
小组口号});
break;
ca"rejected":
tTimeout(function(){
sult);
});
break;
default:
}
}
};
/* 暴露API */
if(typeof window !=="undefined") window.Promi = Promi;
if(typeof module ==="object"&&ports ==="object") ports = Promi;
})();
// new Promi的时候会把executor函数⽴即执⾏
// + 传递两个实参:resolve/reject来接收
// + executor函数中
// + 执⾏resolve,会把实例的状态改为fulfilled,传递的值就是[[PromiResult]]
// + 执⾏reject,会把实例的状态改为rejected,传递的值也是[[PromiResult]]
// + 执⾏代码出现问题了,实例的状态也是rejected,[[PromiResult]]存储的是报错的原因
// + 在execuotr函数中⼀般会管理我们的异步编程代码
// 创造promi实例「p1」,每个实例都有两个属性
// + [[PromiState]]:'pending'准备 / 'fulfilled(resolved)'成功 / 'rejected'失败,⼀但状态从pending变
为fulfilled或者rejected,则不能⼆次改变了// + [[PromiResult]]:实例的值「成功的结果或者失败的原因,最开始的默认是undefined」
柏子仁的功效与作用let p1 =new Promi(function executor(resolve, reject){
tTimeout(()=>{
resolve(100);
console.log('OK');
},1000);
});
// Promi.prototype.then(onfulfilled/onrejected)
// + 此时已经知道p1的状态了
// + 如果状态是成功的,则执⾏onfulfilled,并且把实例的result值(成功的结果)传递给这个⽅法
// + 如果状态是失败的,则执⾏onrejected,并且把实例的result值(失败的原因)传递给这个⽅法
专升本学费// + ⽽且执⾏onfulfilled/onrejected中的某个⽅法,不是⽴即执⾏,⽽是异步的微任务
// + 此时不知道p1的状态是成功还是失败
// + 我们先把onfulfilled、onrejected存储起来
// + 当后期把状态更改后「executor->resolve/reject执⾏」,再去通知之前存放的指定⽅法执⾏「异步的微任务」
p1.then(function onfulfilled(value){
console.log('成功', value);
},function onrejected(reason){
console.log('失败', reason);
});
p1.then(function onfulfilled(value){
console.log('成功', value);
},function onrejected(reason){
console.log('失败', reason);
});
console.log('END');