亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

jquery.Callbacks的實現詳解

2019-11-19 18:45:28
字體:
來源:轉載
供稿:網友

前言

jQuery.Callbacks是jquery在1.7版本之后加入的,是從1.6版中的_Deferred對象中抽離的,主要用來進行函數隊列的add、remove、fire、lock等操作,并提供once、memory、unique、stopOnFalse四個option進行一些特殊的控制。

功能介紹

jq的Callbacks模塊主要是為其他模塊提供服務的,他就像一個溫柔的小女人,在背后默默地付出。Deferred就像一個巨人,在jq中那么的突出,但在內部,他受到Callbacks的服務。

Callbacks的幾種狀態:

      once    -- 回調函數只執行一次

      unique    -- 函數不能重復添加到回調列表中

      memory    -- 狀態記憶,主要用于Deferred中

      stopOnFalse    -- 遇到return false 終止回調列表繼續執行

我自己實現的Callbacks的幾個簡單的方法

      add    -- 向對應的回調函數列表添加一個函數

      fire    -- 觸發回調,回調函數列表依次執行函數

      has    -- 回調函數列表是否存在傳入函數

      clear    -- 清空回調函數列表

整體結構

首先,我們要向得到一個想要的Callbacks模塊,需要這樣做:

var cb = Callback('memory once') // 得到一個擁有記憶功能并只執行一次的回調模塊

由于我們需要基于一定狀態來得到不同的實例,我們可以確定,我們需要一個存儲狀態的對象

var callbackState = {}

我們給Callback函數傳入了'memory once',我們怎么記錄這兩個狀態呢,在這里,仿jq來寫的一個函數來實現,如下:

var createCallbackState = function (options) { var states = options.split(' ') var obj = {} for (var i = 0; i < states.length; i++) {  obj[states[i]] = true } return obj }

以上代碼,將 'memory once'  變成了 {memory: true, once: true} ,如果狀態緩存對象里有這個對象,直接返回,沒有的話先創建再返回。

接下來,就是Callback函數的全部代碼了,先上代碼

var Callback = function (options) { var state = callbackState[options] //獲取狀態模式 if (!state) {  callbackState[options] = state = createCallbackState(options) } var list = [], // 回調函數列表  memory,  // 存儲是否為 記憶狀態  has = function (fn) {   for (var i = 0; i < list.length; i++) {   if (list[i] === fn) {   return true   }  }  return false  },  add = function () {  var i = 0,   args = arguments,   len = args.length  for (; i < len; i++) {   if (state.unique && has(args[i])) { // 如果是unique狀態下并回調列表已經擁有該函數,則不添加   continue   }   list.push(args[i])  }  },  fire = function (context, args) {  var i = 0,   len = list.length,   item  for (; i < len; i++) {   item = list[i]   if (item.apply(context,args) === false && state.stopOnFalse) { //如果函數運行返回false,并且是stopOnFalse狀態,終止循環   break;   }  }  } return {  add: function () {  add.apply(null,arguments)  // 如果memory模式并且已經擁有了memory信息,接著出發函數  if (state.memory && memory) {   fire(memory[0], memory[1])   list = []  }  },  fire: function (context, args) {  // 如果memory模式,并且list是空,代表觸發在添加前,保存memory信息  if (state.memory && !list.length) {   memory = [context, args]   return  }  fire(context,args)  if (state.once) {   this.clear()  }  },  has: function (fn) {  return has(fn)  },  clear: function () {  list = []  } } }

Callback函數執行后,返回一個對象,然后該對象包含了幾個簡單的功能。

下面我來介紹一下這部分的實現。

首先,如jq一樣,我也定義了內部的add, fire, has方法,主要原因是邏輯需要,在返回對象的方法中實現once,memory狀態控制,內部的add,fire方法是純粹的添加和觸發函數。

先來看cb.add方法,add方法可以接收多個函數,因此

add.apply(null,arguments)

使用內部的add做添加功能

再往下的一部分的功能是判斷這個回調模塊是否是memory狀態,理解Deferred模塊的同學應該知道,該模塊是Promise模式,訂閱成功或失敗狀態的回調函數,然后再某一時刻觸發他,這個模式便引用了memory狀態下的Callback,這個模式有一個奇怪的地方,如果你先發布成功,但是回調列表空空如也,那么程序并不會發布失敗,而是等待成功回調函數的加入,一但回調函數加入,立刻執行他。

就是如下代碼

// 如果memory模式并且已經擁有了memory信息,立刻觸發函數 if (state.memory && memory) { fire(memory[0], memory[1]) list = [] }

提示 : ‘如果你先發布成功,但是回調列表空空如也,那么程序并不會發布失敗,而是等待成功回調函數的加入,一但回調函數加入,立刻執行他' 的理解如下代碼

var cb = Callback('memory') // 得到記憶功能的回調模塊cb.fire() // 觸發回調隊列cb.add(fn) //添加回調函數,自動執行了!function fn () { console.log('fn') }

如果在非memory狀態,以上代碼無效。需要再次fire才會執行。

經過上述,fire函數也好理解了,fire可接收兩個參數,函數上下文,函數參數數組。

與add中memory狀態的代碼連串起來,以下代碼就是fire時memory狀態下的操作

// 如果memory模式,并且list是空,代表觸發在添加前,保存memory信息  if (state.memory && !list.length) {   memory = [context, args]   return  }

如果是memory狀態,回調列表為空,就保存函數執行上下文和參數數組,等add時立刻執行。

除了上述以外,代碼就很簡單易懂啦,Callback函數就到這里了,很簡單的功能,唯一一點不好理解的就是memory狀態。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成人激情在线观看| 日韩精品在线观看一区二区| 国产精品久久久久久久午夜| 国产一区二区日韩精品欧美精品| 日韩电视剧在线观看免费网站| 精品国产一区二区在线| 久久久免费观看视频| 国产精品国产亚洲伊人久久| 久久精品91久久久久久再现| 亚洲成人aaa| 亚洲午夜色婷婷在线| 欧美激情综合亚洲一二区| 欧美日韩国产在线播放| 在线中文字幕日韩| 国产91ⅴ在线精品免费观看| 一区二区三区无码高清视频| 国产精品777| 国产欧美日韩中文字幕| 欧美日韩美女视频| 日韩在线视频中文字幕| 91热精品视频| 亚洲国产成人91精品| 精品丝袜一区二区三区| 欧美性xxxxx极品娇小| 日韩中文在线中文网在线观看| 欧美日韩一区二区三区在线免费观看| 久久久999精品| 亚洲xxx自由成熟| 精品国产欧美一区二区三区成人| 久久好看免费视频| 国产精品视频内| 久久精品国产电影| 欧美精品做受xxx性少妇| 亚洲图片制服诱惑| 亚洲无亚洲人成网站77777| 在线精品视频视频中文字幕| 国产精品嫩草视频| 日韩精品高清在线| 欧美国产日韩在线| 欧美电影在线观看完整版| 久久久亚洲影院你懂的| 最新中文字幕亚洲| 国产日韩专区在线| 欧美国产日韩二区| 国产日韩精品视频| 亚洲美女中文字幕| 国产精品国产自产拍高清av水多| 日韩国产精品亚洲а∨天堂免| 亚洲人a成www在线影院| 亚洲精品美女在线| 亚洲自拍中文字幕| 欧美黑人巨大精品一区二区| 91精品国产综合久久香蕉最新版| 欧美电影《睫毛膏》| 久久亚洲精品国产亚洲老地址| 国产精品69久久久久| 欧美电影在线观看高清| 欧美另类高清videos| 国产精品福利无圣光在线一区| 国产精品夜色7777狼人| 欧美日韩国产一区中文午夜| 亚洲精品999| 日韩av第一页| 欧美一级视频一区二区| 亚洲天堂久久av| 亚洲日本欧美中文幕| 不用播放器成人网| 在线精品国产成人综合| 欧美激情亚洲激情| 国产欧美精品一区二区三区-老狼| 欧美一级大片视频| 欧美www在线| 欧美一级黄色网| 久久久欧美一区二区| 国产精品永久免费视频| 久久成人18免费网站| 欧美成人高清视频| 日韩一区视频在线| 亚洲国产欧美精品| 色哟哟亚洲精品一区二区| 日韩精品中文字幕在线播放| 日韩av第一页| 日产精品久久久一区二区福利| 深夜福利日韩在线看| 亚洲区一区二区| 亚洲第一天堂无码专区| 国语自产精品视频在线看抢先版图片| 91精品啪在线观看麻豆免费| 欧美精品成人在线| 亚洲欧美日韩在线高清直播| 911国产网站尤物在线观看| 欧美日韩中国免费专区在线看| 九九精品在线观看| 欧美综合一区第一页| 欧美午夜宅男影院在线观看| 7777精品久久久久久| 亚洲国产精品久久久久秋霞蜜臀| 亚洲最大中文字幕| 亚洲第一精品自拍| 国产精品18久久久久久麻辣| 91成人国产在线观看| 中文字幕亚洲综合久久| 国产一区二区三区免费视频| 欧美xxxx做受欧美| 欧美大肥婆大肥bbbbb| 91tv亚洲精品香蕉国产一区7ujn| 欧美激情一区二区三区在线视频观看| 亚州精品天堂中文字幕| 亚洲片国产一区一级在线观看| 亚洲一级片在线看| 国产99视频在线观看| 精品欧美aⅴ在线网站| 亚洲精品一区二区三区婷婷月| 成人av.网址在线网站| 欧洲一区二区视频| 亚洲国产高清高潮精品美女| 欧美性精品220| 国产拍精品一二三| 国产一区二区三区在线播放免费观看| 另类专区欧美制服同性| 国内精品一区二区三区| 国产精品人人做人人爽| 亚洲第一区第一页| 欧美成人一区在线| 国产中文欧美精品| 国产色综合天天综合网| 日韩欧美极品在线观看| 2021久久精品国产99国产精品| 欧美综合国产精品久久丁香| 日韩视频免费中文字幕| 91理论片午午论夜理片久久| 精品久久久久久久久久久久| 日韩性xxxx爱| 久久久亚洲欧洲日产国码aⅴ| 日韩av毛片网| 日韩精品视频免费| 亚洲一二在线观看| 久久精品99久久久久久久久| 亚州精品天堂中文字幕| 欧美激情成人在线视频| 日韩精品一二三四区| 欧美高清视频免费观看| 国产日本欧美在线观看| 欧美激情一级精品国产| 欧美xxxx18性欧美| 亚洲精品动漫100p| 日韩麻豆第一页| 欧美日本国产在线| 国产a∨精品一区二区三区不卡| 国产一区二区三区视频| 欧美裸身视频免费观看| 国产成人福利网站| 色偷偷噜噜噜亚洲男人的天堂| 国产精品国产亚洲伊人久久| 一区二区国产精品视频| 欧美精品电影在线| 最近2019中文字幕大全第二页| 国产精品九九九| 欧美日韩加勒比精品一区| 久久国产精品久久久久久| 久久久久久亚洲精品中文字幕| 久久精品久久精品亚洲人| 91亚洲va在线va天堂va国| 国产999视频|