成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

promise原理探究

Imfan / 2352人閱讀

摘要:直接修改狀態(tài)為指定值,然后接著執(zhí)行回調(diào)嗚嗚嗚,有時候總會犯傻不是,上面第一種維護一個定時器,效率低下第二種把狀態(tài)變得很麻煩和復雜其實很多事情之所以復雜,是因為我們想的太多。根本沒那么復雜,就三個狀態(tài),搞毛線定時器,狀態(tài)跟蹤。

前言

Promise是個什么玩意,大家都知道,度娘告訴我,以同步方式書寫異步,解決回調(diào)地獄。。。

狀態(tài)機

早聞Promise的大名,簡單介紹,根據(jù)狀態(tài)改變來執(zhí)行相應(yīng)處理函數(shù)。
Promise的狀態(tài)極其簡單,只有 "pending", "resolved", "rejected"三種狀態(tài)
然后就是如何實現(xiàn)的問題,最關(guān)鍵的當然是監(jiān)聽到狀態(tài)的更新,然后才能做出回應(yīng),那么如何知道狀態(tài)變了呢?
最初單純的我開了一個腦洞,有以下想法:

寫一個定時器不斷查詢狀態(tài)值,如果有變化,那么執(zhí)行回調(diào)

利用ES5的 Object.defineProperty(obj, prop, descriptor)來追蹤狀態(tài)變化。

直接修改狀態(tài)為指定值,然后接著執(zhí)行回調(diào)

嗚嗚嗚,有時候總會犯傻不是,上面第一種維護一個定時器,效率低下;第二種把狀態(tài)變得很麻煩和復雜;
其實很多事情之所以復雜,是因為我們想的太多。
Promise根本沒那么復雜,就三個狀態(tài),搞毛線定時器,狀態(tài)跟蹤。
利用觀察者模式,只需要通過特定書寫方式注冊對應(yīng)狀態(tài)的事件處理函數(shù),然后更新狀態(tài),調(diào)用注冊過的處理函數(shù)即可。這個特定方式就是 then ,done ,fail, always...等方法;更新狀態(tài)觸發(fā)時機就是resolve, reject方法。

簡單實現(xiàn)

理論分析:

寫一個類對象,維護一個 state,值有3種:"pending", "resolved", "rejected"

通過then done fail always方法注冊回調(diào)處理函數(shù)

通過resolve reject分別更新對應(yīng)狀態(tài),并且調(diào)用注冊函數(shù)

代碼如下:

/**
 * [3種狀態(tài)]
 * @type {String}
 */
var PENDING = "pending";
var RESOLVED = "resolved";
var REJECTED = "rejected";

/**
 * [Promise類實現(xiàn)]
 * 構(gòu)造函數(shù)傳入一個fn,有兩個參數(shù),resolve:成功回調(diào); reject:失敗回調(diào);
 * state: 狀態(tài)存儲
 * doneList: 成功處理函數(shù)列表
 * failList: 失敗處理函數(shù)列表
 * done: 注冊成功處理函數(shù)
 * fail: 注冊失敗處理函數(shù)
 * then: 同時注冊成功和失敗處理函數(shù)
 * always: 一個處理注冊到成功和失敗,都會調(diào)用
 * resolve: 更新state為:RESOLVED,并且執(zhí)行成功處理隊列
 * reject: 更新state為:REJECTED,并且執(zhí)行失敗處理隊列
 */
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

使用方式,請到https://github.com/donglegend/MyPromise下載使用

源碼下載

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/96318.html

相關(guān)文章

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

    摘要:前言在異步處理方案中,目前最為簡潔優(yōu)雅的便是函數(shù)以下簡稱函數(shù)。聲明式表達式作為對象屬性作為對象屬性的簡寫式箭頭函數(shù)返回值執(zhí)行函數(shù),會固定的返回一個對象。如果該對象最終成功,則會返回成功的返回值,相當將替換成返回值。 前言 在異步處理方案中,目前最為簡潔優(yōu)雅的便是async函數(shù)(以下簡稱A函數(shù))。經(jīng)過必要的分塊包裝后,A函數(shù)能使多個相關(guān)的異步操作如同同步操作一樣聚合起來,使其相互間的關(guān)系...

    leiyi 評論0 收藏0
  • 前端錯誤監(jiān)控與收集探究

    摘要:這樣很容易造成大的損失,提前做好錯誤收集和處理,可以減少損失。 編寫代碼只是做好項目的一小部分,寫代碼難免會碰到錯誤。因此,在項目上線后,我們還需要主動對項目的錯誤進行收集,不能等用戶發(fā)現(xiàn)錯誤,再聯(lián)系我們,我們再去處理。這樣很容易造成大的損失,提前做好錯誤收集和處理,可以減少損失。 本人并沒有做過相關(guān)的工作,下面的文章只是我在學習中的一點思考和總結(jié),可能有比較多不足和錯誤的地方,希望大...

    ZoomQuiet 評論0 收藏0
  • javascript知識點

    摘要:模塊化是隨著前端技術(shù)的發(fā)展,前端代碼爆炸式增長后,工程化所采取的必然措施。目前模塊化的思想分為和。特別指出,事件不等同于異步,回調(diào)也不等同于異步。將會討論安全的類型檢測惰性載入函數(shù)凍結(jié)對象定時器等話題。 Vue.js 前后端同構(gòu)方案之準備篇——代碼優(yōu)化 目前 Vue.js 的火爆不亞于當初的 React,本人對寫代碼有潔癖,代碼也是藝術(shù)。此篇是準備篇,工欲善其事,必先利其器。我們先在代...

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

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

    wudengzan 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<