国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

promise原理探究

Imfan / 2347人閱讀

摘要:直接修改狀態(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方法。

簡(jiǎn)單實(shí)現(xiàn)

理論分析:

寫一個(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

相關(guān)文章

  • Async:簡(jiǎn)潔優(yōu)雅的異步之道

    摘要:前言在異步處理方案中,目前最為簡(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)系...

    leiyi 評(píng)論0 收藏0
  • 前端錯(cuò)誤監(jiā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ò)誤的地方,希望大...

    ZoomQuiet 評(píng)論0 收藏0
  • javascript知識(shí)點(diǎn)

    摘要:模塊化是隨著前端技術(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)備篇,工欲善其事,必先利其器。我們先在代...

    Karrdy 評(píng)論0 收藏0
  • 我們不背誦 API,只實(shí)現(xiàn) API

    摘要:接下來,我們換一種思路,用一個(gè)相對(duì)較新的來實(shí)現(xiàn)方法。從這道題目看出,相比考察死記硬背,這樣的實(shí)現(xiàn)更有意義。對(duì)數(shù)組的操作我們不能陌生,其中方法更要做到駕輕就熟。最后,我們?cè)倏聪律鐓^(qū)上著名的和的實(shí)現(xiàn)。 有不少剛?cè)胄械耐瑢W(xué)跟我說:JavaScript 很多 API 記不清楚怎么辦?數(shù)組的這方法、那方法總是傻傻分不清楚,該如何是好?操作 DOM 的方式今天記,明天忘,真讓人奔潰! 甚至有的開發(fā)...

    wudengzan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<