摘要:直接修改狀態(tài)為指定值,然后接著執(zhí)行回調(diào)嗚嗚嗚,有時(shí)候總會(huì)犯傻不是,上面第一種維護(hù)一個(gè)定時(shí)器,效率低下第二種把狀態(tài)變得很麻煩和復(fù)雜其實(shí)很多事情之所以復(fù)雜,是因?yàn)槲覀兿氲奶唷8緵]那么復(fù)雜,就三個(gè)狀態(tài),搞毛線定時(shí)器,狀態(tài)跟蹤。
前言
Promise是個(gè)什么玩意,大家都知道,度娘告訴我,以同步方式書寫異步,解決回調(diào)地獄。。。
狀態(tài)機(jī)早聞Promise的大名,簡(jiǎn)單介紹,根據(jù)狀態(tài)改變來執(zhí)行相應(yīng)處理函數(shù)。
Promise的狀態(tài)極其簡(jiǎn)單,只有 "pending", "resolved", "rejected"三種狀態(tài)
然后就是如何實(shí)現(xiàn)的問題,最關(guān)鍵的當(dāng)然是監(jiān)聽到狀態(tài)的更新,然后才能做出回應(yīng),那么如何知道狀態(tài)變了呢?
最初單純的我開了一個(gè)腦洞,有以下想法:
寫一個(gè)定時(shí)器不斷查詢狀態(tài)值,如果有變化,那么執(zhí)行回調(diào)
利用ES5的 Object.defineProperty(obj, prop, descriptor)來追蹤狀態(tài)變化。
直接修改狀態(tài)為指定值,然后接著執(zhí)行回調(diào)
嗚嗚嗚,有時(shí)候總會(huì)犯傻不是,上面第一種維護(hù)一個(gè)定時(shí)器,效率低下;第二種把狀態(tài)變得很麻煩和復(fù)雜;
其實(shí)很多事情之所以復(fù)雜,是因?yàn)槲覀兿氲奶唷?br>Promise根本沒那么復(fù)雜,就三個(gè)狀態(tài),搞毛線定時(shí)器,狀態(tài)跟蹤。
利用觀察者模式,只需要通過特定書寫方式注冊(cè)對(duì)應(yīng)狀態(tài)的事件處理函數(shù),然后更新狀態(tài),調(diào)用注冊(cè)過的處理函數(shù)即可。這個(gè)特定方式就是 then ,done ,fail, always...等方法;更新狀態(tài)觸發(fā)時(shí)機(jī)就是resolve, reject方法。
理論分析:
寫一個(gè)類對(duì)象,維護(hù)一個(gè) state,值有3種:"pending", "resolved", "rejected"
通過then done fail always方法注冊(cè)回調(diào)處理函數(shù)
通過resolve reject分別更新對(duì)應(yīng)狀態(tài),并且調(diào)用注冊(cè)函數(shù)
代碼如下:
/** * [3種狀態(tài)] * @type {String} */ var PENDING = "pending"; var RESOLVED = "resolved"; var REJECTED = "rejected"; /** * [Promise類實(shí)現(xiàn)] * 構(gòu)造函數(shù)傳入一個(gè)fn,有兩個(gè)參數(shù),resolve:成功回調(diào); reject:失敗回調(diào); * state: 狀態(tài)存儲(chǔ) * doneList: 成功處理函數(shù)列表 * failList: 失敗處理函數(shù)列表 * done: 注冊(cè)成功處理函數(shù) * fail: 注冊(cè)失敗處理函數(shù) * then: 同時(shí)注冊(cè)成功和失敗處理函數(shù) * always: 一個(gè)處理注冊(cè)到成功和失敗,都會(huì)調(diào)用 * resolve: 更新state為:RESOLVED,并且執(zhí)行成功處理隊(duì)列 * reject: 更新state為:REJECTED,并且執(zhí)行失敗處理隊(duì)列 */ var Promise = (function (){ function Promise(fn){ this.state = PENDING; this.doneList = []; this.failList = []; this.fn = fn; this.fn(this.resolve.bind(this), this.reject.bind(this)) } var p = { done: function (cb){ if(typeof cb == "function") this.doneList.push(cb) return this; }, fail: function(cb){ if(typeof cb == "function") this.failList.push(cb); return this; }, then: function(success, fail){ this.done(success || noop).fail(fail || noop) return this; }, always: function(cb){ this.done(cb).fail(cb) return this; }, resolve: function(){ this.state = RESOLVED; var lists = this.doneList; for(var i = 0, len = lists.length; i使用方式,請(qǐng)到https://github.com/donglegend/MyPromise下載使用
源碼下載
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/96318.html
摘要:前言在異步處理方案中,目前最為簡(jiǎn)潔優(yōu)雅的便是函數(shù)以下簡(jiǎn)稱函數(shù)。聲明式表達(dá)式作為對(duì)象屬性作為對(duì)象屬性的簡(jiǎn)寫式箭頭函數(shù)返回值執(zhí)行函數(shù),會(huì)固定的返回一個(gè)對(duì)象。如果該對(duì)象最終成功,則會(huì)返回成功的返回值,相當(dāng)將替換成返回值。 前言 在異步處理方案中,目前最為簡(jiǎn)潔優(yōu)雅的便是async函數(shù)(以下簡(jiǎn)稱A函數(shù))。經(jīng)過必要的分塊包裝后,A函數(shù)能使多個(gè)相關(guān)的異步操作如同同步操作一樣聚合起來,使其相互間的關(guān)系...
摘要:這樣很容易造成大的損失,提前做好錯(cuò)誤收集和處理,可以減少損失。 編寫代碼只是做好項(xiàng)目的一小部分,寫代碼難免會(huì)碰到錯(cuò)誤。因此,在項(xiàng)目上線后,我們還需要主動(dòng)對(duì)項(xiàng)目的錯(cuò)誤進(jìn)行收集,不能等用戶發(fā)現(xiàn)錯(cuò)誤,再聯(lián)系我們,我們?cè)偃ヌ幚怼_@樣很容易造成大的損失,提前做好錯(cuò)誤收集和處理,可以減少損失。 本人并沒有做過相關(guān)的工作,下面的文章只是我在學(xué)習(xí)中的一點(diǎn)思考和總結(jié),可能有比較多不足和錯(cuò)誤的地方,希望大...
摘要:模塊化是隨著前端技術(shù)的發(fā)展,前端代碼爆炸式增長(zhǎng)后,工程化所采取的必然措施。目前模塊化的思想分為和。特別指出,事件不等同于異步,回調(diào)也不等同于異步。將會(huì)討論安全的類型檢測(cè)惰性載入函數(shù)凍結(jié)對(duì)象定時(shí)器等話題。 Vue.js 前后端同構(gòu)方案之準(zhǔn)備篇——代碼優(yōu)化 目前 Vue.js 的火爆不亞于當(dāng)初的 React,本人對(duì)寫代碼有潔癖,代碼也是藝術(shù)。此篇是準(zhǔn)備篇,工欲善其事,必先利其器。我們先在代...
摘要:接下來,我們換一種思路,用一個(gè)相對(duì)較新的來實(shí)現(xiàn)方法。從這道題目看出,相比考察死記硬背,這樣的實(shí)現(xiàn)更有意義。對(duì)數(shù)組的操作我們不能陌生,其中方法更要做到駕輕就熟。最后,我們?cè)倏聪律鐓^(qū)上著名的和的實(shí)現(xiàn)。 有不少剛?cè)胄械耐瑢W(xué)跟我說:JavaScript 很多 API 記不清楚怎么辦?數(shù)組的這方法、那方法總是傻傻分不清楚,該如何是好?操作 DOM 的方式今天記,明天忘,真讓人奔潰! 甚至有的開發(fā)...
閱讀 2348·2021-11-15 11:37
閱讀 2625·2021-09-23 11:21
閱讀 2951·2021-09-07 10:11
閱讀 3164·2019-08-30 15:53
閱讀 2826·2019-08-29 15:13
閱讀 1606·2019-08-26 13:57
閱讀 1098·2019-08-26 12:23
閱讀 2438·2019-08-26 11:51