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