就覺得應該要來看看啥是 Deferred 物件. 跑去看 Vexe'd 先生的 jQuery Deferred Object . 裏頭說道去看 jQuery 原始碼 (搜尋 Deferred: ), 發現一堆啥Callbacks("once memory"). 才發現要從源頭理解 Deferred 物件運作原理,就得先從 jQuery.Callbacks下手.
當然先從官方文件著手.大概涵義翻譯一下, 主要是提供一個callback list object, 在這個callback list object當中,我先介紹最基礎的四項操作.
- callbacks.add() - 新增callback function 到 list 當中.
- callbacks.remove() - 同理,就是從callback list 移除callback function.
- callbacks.fire() - 觸發callback list當中的function.
- callbacks.disable() - 取消掉任何之後對此callback list object 的事件觸發, fire()
- 範例1 - 無任何Support Flags. 有啥東西在 callback list object 就fire()!
- 範例2 - once 確保這個callback list只會被fire()一次.如範例, 第一次fire()之後, 第二個fire並不會被觸發.
- 範例3 - memory 這個 Flags比較有趣一點, 如果新增了一個callback function之後,他會立刻觸發 fire() , 然後在觸發新的值.在範例當中看2nd add 以及 2nd fire以及比對下方沒有設定Support Flags的執行情況,就可以很明顯知道差別.
(在Deferred 原始碼看到很多once 跟memory的組合用法, 之後再深入理解Deferred物件後應該會知道這樣時做的原因吧.) - 範例4 - unique 概念很簡單, 就是重複的callback function將只會執行一次!
- 範例5 - stopOnFalse 概念也不難,就是遇到 callback function回傳false時候,中斷其執行.
Deferred: function( func ) {
var doneList = jQuery.Callbacks( "once memory" ),
failList = jQuery.Callbacks( "once memory" ),
progressList = jQuery.Callbacks( "memory" ),
這邊有三個 list : doneList, failList 以及progressList. 其中doneList 跟failList 都是 once 以及memory. 稍微做了一下範例實驗, 確保doneList 跟failList 只會被若增加新的 callback function都會執行, 但是最多只能fire() 一次內容. 而 progressList 則是每次有新的callback function加入都會觸發之外, 還可以被fire() 多次.
目前就先就 jQuery.Callbacks做個簡單介紹, 之後會進入jQuery.Deferred 物件以及Promise()方法, 這可是之後語言幾乎都會參考的一部分程式碼啊!