머리말
jQuery.Callbacks는 버전 1.7 이후 jquery에 추가되었습니다. 버전 1.6의 _Deferred 개체에서 추출되었으며 주로 함수 대기열 및 기타 항목을 추가, 제거, 실행 및 잠그는 데 사용됩니다. 작업을 수행하며 메모리, 고유 및 일부 특수 제어를 위한 stopOnFalse라는 네 가지 옵션을 제공합니다.
기능 소개
jq의 Callbacks 모듈은 주로 다른 모듈에 대한 서비스를 제공합니다. 마치 뒤에서 조용히 돈을 지불하는 온순한 작은 여자와 같습니다. Deferred는 거인과 같아서 jq에서 매우 유명하지만 내부적으로는 콜백의 서비스를 받습니다.
콜백의 여러 상태:
한 번 — 콜백 함수는 한 번만 실행됩니다.
고유 — 함수는 콜백 목록에 반복적으로 추가할 수 없습니다.
memory - Deferred에서 주로 사용되는 State 메모리
stopOnFalse - return false가 발생하면 콜백 목록을 종료하고 계속 실행
구현했습니다. self 콜백의 몇 가지 간단한 메소드
add — 해당 콜백 함수 목록에 함수 추가
fire — 콜백을 트리거하고 콜백 함수 목록이 함수를 순차적으로 실행합니다
has - 콜백 함수 목록에 들어오는 함수가 있는지 여부
clear - 콜백 함수 목록 지우기
전체 구조
먼저 원하는 콜백 모듈을 얻으려면 다음을 수행해야 합니다.
cb = Callback('memory once') // 得到一个拥有记忆功能并只执行一次的回调模块
특정 상태에 따라 다양한 인스턴스를 가져와야 하므로 저장할 객체가 필요하다고 판단할 수 있습니다. 상태
var callbackState = {}
'memory Once'를 Callback 함수에 전달했습니다. 이 두 상태를 어떻게 기록합니까? 여기서는 다음과 같이 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 }
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 = [] } } }
add.apply(null,arguments)
// 如果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模式,并且list是空,代表触发在添加前,保存memory信息 if (state.memory && !list.length) { memory = [context, args] return }