手写promi(面试版)

更新时间:2023-06-28 19:50:35 阅读: 评论:0

⼿写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');

本文发布于:2023-06-28 19:50:35,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1061153.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:状态   实例   失败   传递   改为
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图