摘要:缓存默认状态为此变量里放着此的结果存放的着所有成功的回调函数存放着所有的失败的回调函数调用此方法可以把变成成功态的时候你把挣到的钱传进来调用此方法可以把当前的变成失败态如果当前状态是初始态,则转成失败态立即执行传入的任务如果就是循环引用成功
function Promise(task) { let that = this;//缓存this //默认状态为pending that.status = "pending"; //此变量里放着此promise的结果 that.value = undefined; //存放的着所有成功的回调函数 that.onResolvedCallbacks = []; //存放着所有的失败的回调函数 that.onRejectedCallbacks = []; //调用此方法可以把promise变成成功态 //resolve的时候你把挣到的钱传进来 function resolve(value) { if(value instanceof Promise){ return value.then(resolve,reject); } if (that.status == "pending") { that.status = "fulfilled"; that.value = value; that.onResolvedCallbacks.forEach(item=>item(that.value)); } } //调用此方法可以把当前的promise变成失败态 function reject(reason) { //如果当前状态是初始态,则转成失败态 if (that.status == "pending") { that.status = "rejected"; that.value = reason; that.onRejectedCallbacks.forEach(item=>item(that.value)); } } //立即执行传入的任务 try { task(resolve, reject); } catch (e) { reject(e); } } function resolvePromise(promise2,x,resolve,reject){ let then; //如果x就是promise2 if(promise2 === x){ return reject(new TypeError("循环引用")); } if(x instanceof Promise){ if(x.status == "pending"){ x.then(function(y){ resolvePromise(promise2,y,resolve,reject); },reject); }else if(x.status == "fulfilled"){ resolve(x.value); }else if(x.status == "rejected"){ reject(x.value); } }else if(x!=null && (typeof x == "object" || typeof x == "function")){ try{ then = x.then; if(typeof then == "function"){ then.call(x,function(y){ resolvePromise(promise2,y,resolve,reject) },reject); } }catch(e){ reject(e); }; }else{ resolve(x); } } //onFulfilled成功的回调,onReject失败的回调 Promise.prototype.then = function (onFulfilled, onReject) { onFulfilled = typeof onFulfilled == "function"?onFulfilled:function(value){return value}; onReject = typeof onReject=="function"?onReject:function(reason){ throw reason; } let that = this; let promise2; if(that.status == "fulfilled"){ promise2 = new Promise(function(resolve,reject){ let x = onFulfilled(that.value); resolvePromise(promise2,x,resolve,reject); }); } if(that.status == "rejected"){ promise2 = new Promise(function(resolve,reject){ let x = onReject(that.value); resolvePromise(promise2,x,resolve,reject); }); } if(that.status == "pending"){ promise2 = new Promise(function(resolve,reject){ that.onResolvedCallbacks.push(function(){ let x = onFulfilled(that.value); resolvePromise(promise2,x,resolve,reject); }); that.onRejectedCallbacks.push(function(){ let x = onReject(that.value); resolvePromise(promise2,x,resolve,reject); }); }); } return promise2; } Promise.all = function (arr) { return new Promise((resolve,reject) =>{ let values = [] let len = arr.length for(var i = 0;i < len; i++){ let promise = arr[i] if(typeof promise.then == "function"){ promise.then(res=>{ values.push(res) if(values.length == len){ resolve(values) } }) } } }) } Promise.race = function (arr) { return new Promise((resolve,reject) =>{ let len = arr.length for(var i = 0;i < len; i++){ let promise = arr[i] if(typeof promise.then == "function"){ promise.then(res=>{ resolve(res) }) } } }) } Promise.resolve = function (value) { if (value instanceof Promise) return value return new Promise(resolve => resolve(value)) } Promise.reject = function (value) { return new Promise((resolve,reject)=>reject(value)) } module.exports = Promise;
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/92418.html
摘要:手写一款符合规范的长篇预警有点长,可以选择性观看。初始状态是,状态可以有或者不能从转换为或者从转换成即只要由状态转换为其他状态后,状态就不可变更。 手写一款符合Promise/A+规范的Promise 长篇预警!有点长,可以选择性观看。如果对Promise源码不是很清楚,还是推荐从头看,相信你认真从头看到尾,并且去实际操作了,肯定会有收获的。主要是代码部分有点多,不过好多都是重复的,不...
摘要:有三种状态,等待中,已完成,已失败。对象状态不受外界影响,只有异步操作的结果可以改变状态,这就是的由来怎么用接受一个函数作为参数,这个参数函数的两个参数分别是和,用来执行了两种状态的回调函数。当实例生成后,用方法来指定两种状态的回调函数。 什么是Promise 官方的解释:Promise是一个用来传递异步操作消息的对象。Promise有三种状态,pending(等待中),resolve...
摘要:极简版满足的使用方式生成实例对象的方式通过类直接调用静态方法,目前静态方法仅支持亲测使用,欢迎指教,互相学习,链接,欢迎。附赠利用构造函数手写的方法,链接。 极简版Promise 满足的使用方式 生成实例对象的方式:new MyPromise() 通过类直接调用静态方法:MyPromise.resolve(),目前静态方法仅支持resolve & reject 亲测使用OK,欢...
摘要:简易版本的第一步列出三大块第二步负责注册所有的函数负责执行所有的函数第三步在里面要加上防止还没进行注册就直接执行了第四步里面要返回这样就可以链式调用了第五步三个状态的管理的链式调用在里面一个这样才能里面加上异步函数加上了加入状态为了解决在异 // 简易版本的promise // 第一步: 列出三大块 this.then resolve/reject fn(resolv...
阅读 3478·2023-04-26 02:00
阅读 3077·2021-11-22 13:54
阅读 1698·2021-08-03 14:03
阅读 708·2019-08-30 15:52
阅读 3084·2019-08-29 12:30
阅读 2419·2019-08-26 13:35
阅读 3364·2019-08-26 13:25
阅读 3001·2019-08-26 11:39