当前位置: 首页 > Web前端 > JavaScript

TS实现Promise相关api

时间:2023-03-27 16:04:29 JavaScript

相关文章Promises/A+规范(翻译)使用TS实现Promise(官方测试工具测试通过)本文代码地址api实现了resolve方法resolve方法会返回一个Promise对象resolvedwith一个给定的值。resolve方法的参数值可能有三种类型:value是一个Promise;值是thenable;value既不是Promise也不是thenable。functionresolve(value:T|PromiseLike):MyPromise{//如果value是MyPromise实例,直接返回值。if(valueinstanceofMyPromise)返回值;if((typeofvalue==="object"||typeofvalue==="function")&&"then"invalue&&typeofvalue.then==="function"){//如果值是thenable,转换它到一个MyPromise对象;返回新的MyPromise((_resolve,_reject)=>value.then(_resolve,_reject));}//如果value不是以上两种情况,则返回一个用value解析的Promise。returnnewMyPromise((_resolve:Resolve)=>{_resolve(value);});}reject方法reject方法返回一个带有拒绝原因的Promise对象。functionreject(reason:any){returnnewMyPromise((_,_reject:Reject)=>{_reject(reason);});}all方法all方法接受Promise可迭代类型(Array,Set,Map...)作为参数,只返回一个Promise实例。对于返回的Promise,成功时:其resolve回调会等待参数中所有Promise实例的resolve回调执行完毕;它的值是一个数组,数组的内容由参数中所有Promise实例的值组成。失败时:其reject回调的执行条件是参数中任意一个Promise实例的reject回调被执行;其reject回调的原因是参数中被rejectedPromise抛出的第一条错误信息。//根据可迭代协议,所有实现了Symbol.iterator方法的对象都是可迭代对象。interfaceIterable{[Symbol.iterator]():Iterator;}functionall(promises:Iterable>):MyPromise{让结果=[]作为T[];//Promise的值作为返回值letpromiseCnt=0;让promiseLen="length"在承诺中?Reflect.get(promises,"length"):Reflect.get(promises,"size");returnnewMyPromise((_resolve:Resolve,_reject:Reject)=>{for(letpofpromises){//可迭代对象不一定是PromiseLike,所以Promise.resolve方法处理resolve(p).then((val)=>{results.push(valasT);++promiseCnt;if(promiseCnt===promiseLen)_resolve(results);},(err)=>{_reject(err);});}});}race方法race方法返回一个Promise,一旦迭代器中的Promise被解析或拒绝,返回的Promise将解决或拒绝functionrace(promises:Iterable>):MyPromise{returnnewMyPromise((_resolve:Resolve,_reject:Reject)=>{for(letpofpromises){resolve(p).then(_resolve,_reject);}});}参考文档ECMAScript?2023语言规范