摘要:緩存默認狀態為此變量里放著此的結果存放的著所有成功的回調函數存放著所有的失敗的回調函數調用此方法可以把變成成功態的時候你把掙到的錢傳進來調用此方法可以把當前的變成失敗態如果當前狀態是初始態,則轉成失敗態立即執行傳入的任務如果就是循環引用成功
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;
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/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
閱讀 3078·2021-11-22 13:54
閱讀 1699·2021-08-03 14:03
閱讀 709·2019-08-30 15:52
閱讀 3085·2019-08-29 12:30
閱讀 2420·2019-08-26 13:35
閱讀 3364·2019-08-26 13:25
閱讀 3001·2019-08-26 11:39