摘要:簡易版本的第一步列出三大塊第二步負責注冊所有的函數(shù)負責執(zhí)行所有的函數(shù)第三步在里面要加上防止還沒進行注冊就直接執(zhí)行了第四步里面要返回這樣就可以鏈式調用了第五步三個狀態(tài)的管理的鏈式調用在里面一個這樣才能里面加上異步函數(shù)加上了加入狀態(tài)為了解決在異
// 簡易版本的promise
// 第一步: 列出三大塊 this.then resolve/reject fn(resolve,reject) // 第二步: this.then負責注冊所有的函數(shù) resolve/reject負責執(zhí)行所有的函數(shù) // 第三步: 在resolve/reject里面要加上setTimeout 防止還沒進行then注冊 就直接執(zhí)行resolve了 // 第四步: resolve/reject里面要返回this 這樣就可以鏈式調用了 // 第五步: 三個狀態(tài)的管理 pending fulfilled rejected // *****promise的鏈式調用 在then里面return一個promise 這樣才能then里面加上異步函數(shù) // 加上了catch function PromiseM(fn) { var value = null; var callbacks = []; //加入狀態(tài) 為了解決在Promise異步操作成功之后調用的then注冊的回調不會執(zhí)行的問題 var state = "pending"; var _this = this; //注冊所有的回調函數(shù) this.then = function (fulfilled, rejected) { //如果想鏈式promise 那就要在這邊return一個new Promise return new PromiseM(function (resolv, rejec) { //異常處理 try { if (state == "pending") { callbacks.push(fulfilled); //實現(xiàn)鏈式調用 return; } if (state == "fulfilled") { var data = fulfilled(value); //為了能讓兩個promise連接起來 resolv(data); return; } if (state == "rejected") { var data = rejected(value); //為了能讓兩個promise連接起來 resolv(data); return; } } catch (e) { _this.catch(e); } }); } //執(zhí)行所有的回調函數(shù) function resolve(valueNew) { value = valueNew; state = "fulfilled"; execute(); } //執(zhí)行所有的回調函數(shù) function reject(valueNew) { value = valueNew; state = "rejected"; execute(); } function execute() { //加入延時機制 防止promise里面有同步函數(shù) 導致resolve先執(zhí)行 then還沒注冊上函數(shù) setTimeout(function () { callbacks.forEach(function (cb) { value = cb(value); }); }, 0); } this.catch = function (e) { console.log(JSON.stringify(e)); } //經(jīng)典 實現(xiàn)異步回調 fn(resolve, reject); }
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.hztianpu.com/yun/116252.html
摘要:手寫一款符合規(guī)范的長篇預警有點長,可以選擇性觀看。初始狀態(tài)是,狀態(tài)可以有或者不能從轉換為或者從轉換成即只要由狀態(tài)轉換為其他狀態(tài)后,狀態(tài)就不可變更。 手寫一款符合Promise/A+規(guī)范的Promise 長篇預警!有點長,可以選擇性觀看。如果對Promise源碼不是很清楚,還是推薦從頭看,相信你認真從頭看到尾,并且去實際操作了,肯定會有收獲的。主要是代碼部分有點多,不過好多都是重復的,不...
摘要:有三種狀態(tài),等待中,已完成,已失敗。對象狀態(tài)不受外界影響,只有異步操作的結果可以改變狀態(tài),這就是的由來怎么用接受一個函數(shù)作為參數(shù),這個參數(shù)函數(shù)的兩個參數(shù)分別是和,用來執(zhí)行了兩種狀態(tài)的回調函數(shù)。當實例生成后,用方法來指定兩種狀態(tài)的回調函數(shù)。 什么是Promise 官方的解釋:Promise是一個用來傳遞異步操作消息的對象。Promise有三種狀態(tài),pending(等待中),resolve...
摘要:簡易版本的第一步列出三大塊第二步負責注冊所有的函數(shù)負責執(zhí)行所有的函數(shù)第三步在里面要加上防止還沒進行注冊就直接執(zhí)行了第四步里面要返回這樣就可以鏈式調用了第五步三個狀態(tài)的管理的鏈式調用在里面一個這樣才能里面加上異步函數(shù)加上了加入狀態(tài)為了解決在異 // 簡易版本的promise // 第一步: 列出三大塊 this.then resolve/reject fn(resolv...
摘要:如果實現(xiàn)滿足所有要求,則實現(xiàn)可能允許。本條款允許使用特定于實現(xiàn)的方法來采用已知一致承諾的狀態(tài)。接下來根據(jù)規(guī)范進行手寫實現(xiàn)注釋偷懶就將對應的規(guī)范標注出來,其實基本上就是對著規(guī)范實現(xiàn)。 如果要手寫實現(xiàn)promise,那么先看看promise/A+規(guī)范,再來實現(xiàn),將會事半功倍。那么我先翻譯一下Promise/A+規(guī)范中的內容。 術語 1.1 promise 是一個帶有符合此規(guī)范的the...
摘要:第一種直接調用避免在不必要的情況下使用,是一個危險的函數(shù),他執(zhí)行的代碼擁有著執(zhí)行者的權利。來自于此外,實現(xiàn)需要考慮實例化后對原型鏈的影響。函數(shù)柯里化的主要作用和特點就是參數(shù)復用提前返回和延遲執(zhí)行。手寫路徑導航 實現(xiàn)一個new操作符 實現(xiàn)一個JSON.stringify 實現(xiàn)一個JSON.parse 實現(xiàn)一個call或 apply 實現(xiàn)一個Function.bind 實現(xiàn)一個繼承 實現(xiàn)一個J...
閱讀 1707·2021-11-04 16:11
閱讀 3440·2021-09-09 11:33
閱讀 1645·2019-08-30 15:54
閱讀 681·2019-08-30 15:44
閱讀 3271·2019-08-30 15:43
閱讀 2652·2019-08-30 13:06
閱讀 1761·2019-08-29 17:00
閱讀 970·2019-08-29 15:33