点击联系客服
客服QQ: 客服微信:

中山老站长

 找回密码
 立即注册
查看: 2318|回复: 50

手写promise promise.all promise.race

[复制链接]

1

主题

1

帖子

-7

积分

限制会员

积分
-7
发表于 2021-10-3 15:02:46 | 显示全部楼层 |阅读模式
手写promise

//手写promise

Const  RESOLVE=' resolved//成功状态

Const  REJECT='rejected'//失败状态

Const  PENDING='Pending'//等待状态

Class  MyPromise  {

Status=PENDING

Result=undefined

Reason=undefined

OnResolvedArr=[]

OnRejectArr=[]

将函数传递给constructor(excution){//promise,并定义excution函数

同时定义//resolve和reject参数

constresolve=(result)={//resolve传递result参数

IF(this  . status==PENDING){//promise的状态更改是不可逆的,只能从PENDING切换到RESOLVE或PENDING到REJECT

This.result=result

This.status=RESOLVE

This.onResolvedArr.map((fn)=fn())

}

}

Const  reject=(reason)={//reject接收参数reason

IF(this  . status==PENDING){

This.reason=reason

This.status=REJECT

This.onRejectArr.map((fn)=fn())

}

}

运行(resolve,reject)//接收reslove,reject  2个参数

}

进入//promise的then方法

Then(onResoved,onRejected){

IF(this  . status==RESOLVE){

使用//settimeout将任务转换为异步任务

Settimeout  ()={

OnResoved(this.result)

},0)

}

IF(this  . status==REJECT){

Settimeout  ()={

OnRejected(this.reason)

},0)

}

将异步函数引入发布并接收//订阅模式的promise。

IF(this  . status==PENDING){

this  . onresolvedarr  . push()={

OnResoved(this.result)

})。

this  . on  rejectarr  . push()={

OnRejected(this.reason)

})。

}

}

}

//应用

consttest=newmy  promise((resolve,reject)={

Settimeout  ()={

Resolve('hello  world  ')

},1000)

})。

Test.then((res)={

Console.log(res)

})。

Console.log(1111)

手写promise.all

promise  . all=function(I  terator){//promise  . all将作为迭代器传递

constpromises=array  . from(iterator)//将迭代器转换为数组

Let  count=0

Let  RES=[]//保存结果

Return  new  promise  ((resolve,reject)={//promise.all会传回promise物件

For  (let  I  in  promises){//遍历传入的数据

Promise.resolve(Promises[i])//将传入数据分别转换为promise对象

.then((data)={

Res[i]=data//调用已成功保存到Res

IF(count==promises  . length){//每次调用成功累计count,如果count等于promises长度,则每次调用成功

Resolve(res)//会传回Resolve

}

})。

.如果catch((e)={//count不等于promises的长度时,指示有失败的呼叫,请重新插入reject

Reject(e)

})。

}

})。

}

手写promise.race(与all同理,不需要判断)

Promise.race=function(启动器){

const  promises=array  . from(I  terator)

Return  new  promise  ((resolve,reject)={

For  (let  I  in  promises) {

Promise.resolve(promises[i])

.then((res)={

Resolve(res)

})。

.catch(e={

Reject(e)

})。

}

})。

}
回复

使用道具 举报

1

主题

623

帖子

-392

积分

限制会员

积分
-392
发表于 2021-10-3 15:02:48 | 显示全部楼层
好帖,来顶下
回复

使用道具 举报

1

主题

597

帖子

-384

积分

限制会员

积分
-384
发表于 2021-10-3 15:23:30 | 显示全部楼层
LZ说的很不错
回复

使用道具 举报

1

主题

610

帖子

-379

积分

限制会员

积分
-379
发表于 2021-10-3 15:43:38 | 显示全部楼层
我抢、我抢、我抢沙发~
回复

使用道具 举报

0

主题

611

帖子

-348

积分

限制会员

积分
-348
发表于 2021-10-3 16:03:50 | 显示全部楼层
帮帮顶顶!!
回复

使用道具 举报

0

主题

587

帖子

-390

积分

限制会员

积分
-390
发表于 2021-10-3 16:23:52 | 显示全部楼层
不错
回复

使用道具 举报

1

主题

613

帖子

-391

积分

限制会员

积分
-391
发表于 2021-10-3 16:44:18 | 显示全部楼层
学习了,谢谢分享、、、
回复

使用道具 举报

1

主题

632

帖子

-368

积分

限制会员

积分
-368
发表于 2021-10-3 17:04:25 | 显示全部楼层
前排支持下
回复

使用道具 举报

1

主题

637

帖子

-385

积分

限制会员

积分
-385
发表于 2021-10-3 17:24:29 | 显示全部楼层
前排支持下
回复

使用道具 举报

0

主题

650

帖子

-426

积分

限制会员

积分
-426
发表于 2021-10-3 17:44:35 | 显示全部楼层
学习了,不错,讲的太有道理了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|无图版|手机版|小黑屋|中山@IT精英团

GMT+8, 2022-8-15 12:06 , Processed in 0.656057 second(s), 30 queries .

Powered by Discuz! X3.4

© 2020 Comsenz Inc.

快速回复 返回顶部 返回列表