`

Callbacks源码

 
阅读更多

var callbacks=$.Callbacks(options) 创建实例

 

      options.once 是否只执行一次,默认为否

      options.memory:是否记录上次执行的回调函数参数,记录后,再次执行回调时将该参数推入queue参数数组中,默认为否

      options.unique:保证回调函数的单一性,默认为否

      options.stopOnFalse:当回调返回值为否时,是否终止回调函数执行,默认为否

      配置项可以用字符串输入,将自动转化为对象形式,如"once"将转化为{once:true}

 

callbacks.add(fn) 添加回调函数

callbacks.fire("foo") 将参数"foo"传给各回调函数,并触发回调函数执行

callbacks.fireWith(content,“foo”) 回调函数上下文设为content,参数为"foo",并触发回调函数执行

callbacks.has(fn) 回调函数数组list是否有函数fn

callbacks.empty() 清空回调函数数组list

callbacks.remove(fn) 清除回调函数数组list指定的回调函数fn

callbacks.disable() 使回调函数中add和fireWith、fire方法均不可用,清空回调函数列表list、参数列表queue

callbacks.disabled() 判断实例是否不可用

callbacks.lock() 使回调函数中add方法均不可用,fireWith、fire方法根据memory有无设置有效性,若无且执行状态为不在执行中,fireWith、fire方法不可用

callbacks.lock() 判断实例是否锁死

 

源码书写的长处:

       利用循环语句实现回调函数的顺序执行

       利用循环语句+数组方法起始查询位清空数组中的重复项

       利用转换类型的方式卡死if条件判断,进而阻止函数执行,如list回调函数列表在disable方法执行时设为"",而非[],使其在add方法的条件返回否值,阻止add方法执行

       通过闭包驻留缓存信息如list回调函数数组、queue参数数组、memory前次执行参数记录等

 

源码:

define([
	"./core",
	"./var/rnotwhite"// 返回匹配空白的正则
], function( jQuery,rnotwhite ){

// 当options为字符串时,使用match方法分割空格类字符,各数组项作为object的属性,赋值为true后返回
function createOptions(options){
	var object={};
	jQuery.each( options.match( rnotwhite )||[], function(_,flag){
		object[flag]=true;// 空数组不执行该语句
	} );
	return object;
}

/*
 * Create a callback list using the following parameters:
 *
 *	options: an optional list of space-separated options that will change how
 *			the callback list behaves or a more traditional option object
 *
 * By default a callback list will act like an event callback list and can be
 * "fired" multiple times.
 *
 * Possible options:
 *
 *	once:是否只执行一次,默认为否
 *	memory:是否记录上次执行的回调函数参数,记录后,再次执行回调时将该参数推入queue参数数组中,默认为否
 *	unique:保证回调函数的单一性,默认为否
 *	stopOnFalse:当回调返回值为否时,是否终止回调函数执行,默认为否
 */
jQuery.Callbacks=function(options){

	// 将字符串格式的options转化成对象形式
	options=typeof options==="string" ? createOptions(options) : jQuery.extend({},options);

	var firing,// 回调函数正在执行中状态
		memory,// 前次执行时回调函数使用的参数
		fired,// 回调函数已执行状态
		locked,// 锁定回调函数,回调函数数组清空
		list=[],// 所有回调都添加到list数组列表中
		queue=[],// 数组形式存储回调函数的参数,每个数组项又是数组形式,其中首项为this,即Callbacks对象
		firingIndex=-1,// 用以指向list回调函数数组的序号,便于循环执行回调

		// 内部函数,执行回调
		fire=function(){

			locked=options.once;
			fired=firing=true;

			for ( ; queue.length; firingIndex=-1 ){
				memory=queue.shift();

				while ( ++firingIndex<list.length ){// 利用循环语句使回调函数顺序执行
					if ( list[firingIndex].apply(memory[0], memory[1])===false && options.stopOnFalse ){
						firingIndex=list.length;
						memory=false;
					}
				}
			}

			// 在不记录前次执行回调函数参数的前提下,当memory中的参数已执行,则将memory置为否
			if ( !options.memory ){
				memory=false;
			}

			firing=false;

			// once设为真,只执行一次的前提下,清空回调函数数组
			if ( locked ){
				if ( memory ){
					list=[];
				}else{
					list="";// memory为否,即options.memory为否,此时add方法失效
				}
			}
		},

		self={
			// 添加回调函数
			add:function(){
				if ( list ){

					if ( memory && !firing ){
						firingIndex=list.length-1;// 重新设置firingIndex的意义???
						queue.push(memory);
					}

					(function add(args){
						jQuery.each(args,function(_,arg){
							if ( jQuery.isFunction(arg) ){
								if ( !options.unique || !self.has(arg) ){
									list.push(arg);
								}
							}else if( arg && arg.length && jQuery.type(arg)!=="string" ){
								// 递归添加回调函数
								add(arg);
							}
						} );
					})(arguments);

					if ( memory && !firing ){// options.memory设为真,且没有回调函数执行的前提下,执行回调函数
						fire();
					}
				}
				return this;
			},

			// 从list列表清除某些回调函数
			remove:function(){
				jQuery.each(arguments, function(_,arg){
					var index;
					// 利用循环语句查找list回调函数数组中与arg函数相同的项
					while ( ( index=jQuery.inArray(arg,list,index) ) > -1 ){
						list.splice(index,1);

						if ( index<=firingIndex ){// 影响当前执行的Callbacks实例中的回调函数,函数删除后序号减1
							firingIndex--;
						}
					}
				} );
				return this;
			},

			// 传入参数时判断函数是否list回调函数数组中,否则判断list中是否有回调函数
			has:function(fn){
				return fn ? jQuery.inArray(fn,list)>-1 : list.length>0;
			},

			// 清空回调函数
			empty: function(){
				if ( list ){
					list=[];
				}
				return this;
			},

			// locked设为[],list设为"",使add、fireWith方法失效
			disable: function(){
				locked=queue=[];
				list=memory="";
				return this;
			},

			// 返回当前实例的fire、add方法是否有效,locked判断fire方法可能有效
			disabled: function(){
				return !list;
			},

			// fire方法执行后,执行lock方法,清空参数队列,且locked设为[],使fireWith方法无效(需要locked为否)
			// 当memory和firing均为否时,list置为"",使add方法无效(需要list为否)
			lock: function(){
				locked=queue=[];
				if ( !memory && !firing ) {
					list=memory="";
				}
				return this;
			},

			// 返回当前实例是否被锁定,参数数组queue或回调函数数组list被清空
			locked: function(){
				return !!locked;
			},

			// 执行回调函数,queue数组首项为Callbacks构造函数,其余项为给回调函数的参数
			fireWith: function(context, args){
				if ( !locked ) {
					args=args||[];
					args=[context, args.slice?args.slice():args];
					queue.push(args);
					if ( !firing ){
						fire();
					}
				}
				return this;
			},

			// 执行回调函数,arguments以数组形式传给各回调函数
			fire: function(){
				self.fireWith(this,arguments);
				return this;
			},

			// 返回回调函数是否被调用
			fired: function(){
				return !!fired;
			}
		};

	return self;
};

return jQuery;
});

 

 

0
0
分享到:
评论

相关推荐

    jQuery源码分析之Callbacks详解

    在深入讨论jQuery源码中Callbacks模块的内部实现之前,先要明确什么是Callbacks以及它在JavaScript编程中的作用。Callbacks,即回调函数,在JavaScript中扮演着至关重要的角色。由于JavaScript是基于单线程事件循环...

    前端开源库-backbone-callbacks

    在提供的压缩包`backbone-callbacks-master`中,很可能包含了Backbone.Callbacks的源码、示例、文档和其他相关资源。通过研究这些内容,你可以更深入地了解其内部实现细节和使用场景,从而更好地将其融入到你的项目...

    基于C#+ASP.NET实现的multiple client callbacks 处理技术程序源码

    总结,"基于C#+ASP.NET实现的multiple client callbacks 处理技术程序源码"为开发者提供了学习和实践客户端回调技术的宝贵资源,涵盖了服务器端处理、客户端交互、实时通信等多个方面,对于提升Web应用的实时性和...

    易语言源码易语言VLC播放器类模块源码.rar

    在这个"易语言源码易语言VLC播放器类模块源码.rar"压缩包中,包含的是易语言编写的VLC播放器的类模块源代码。VLC播放器是一款开源、跨平台的多媒体播放器,能够处理多种视频和音频格式,其强大的功能和广泛的兼容性...

    jQuery1.7中的Callbacks

    《jQuery1.7中的Callbacks》 回调函数在JavaScript编程中起着至关重要的作用,尤其是在处理异步操作时。jQuery库为了方便开发者管理这些回调,引入了Callbacks机制。这篇文章将深入探讨jQuery 1.7版本中的Callbacks...

    谈谈jQuery之Deferred源码剖析

    3. **jQuery.Callbacks**:是jQuery提供的一个方法,用于创建回调函数队列。在jQuery.Deferred中,它被用来管理每种状态对应的回调函数队列。 4. **promise对象**:每个Deferred对象都会有一个对应的promise对象,...

    基于Transformer的股票价格预测(Python完整源码)

    基于Transformer的股票价格预测(Python完整源码) ...from tensorflow.keras.callbacks import * from tensorflow.keras.initializers import * from tensorflow.keras import backend as K import tensorflow as tf

    Callbacks

    回调函数(Callbacks)是JavaScript编程中的一个重要概念,它是一种处理异步操作的策略。在JavaScript中,由于其单线程的特性,为了执行耗时的操作(如网络请求、文件读写),我们会使用异步编程来避免阻塞主线程。...

    Android应用源码之企业级discuz论坛安卓苹果客户端-IT计算机-毕业设计.zip

    - **AsyncTask**或**Retrofit Callbacks**:Android中的异步任务处理,防止阻塞主线程,提高用户体验。 9. **单元测试与集成测试**: - **JUnit & Espresso**:进行应用的单元测试和UI测试,确保代码质量。 10. ...

    Node.js-NodeJS源码分析-由浅入深解析架构以及运行原理

    Node.js中的事件循环主要分为六个阶段:timers、pending callbacks、idle, prepare、poll、check和close callbacks,每个阶段都有特定的任务。 二、V8引擎 Node.js使用Google的V8引擎来解析和执行JavaScript代码。...

    NLP文本分类比赛和文本序列标注比赛,完整解决方案(分词、实体、关系抽取,含源码+数据集)

    NLP文本分类比赛和文本序列标注比赛,完整解决方案(分词、关系抽取,含源码+数据集) import jieba import kashgari import numpy as np from tensorflow import keras import pandas as pd # 读取文件数据 返回 ...

    summernote图片上传服务器源码.zip

    1. **前端配置**:在Summernote编辑器中,需要配置一个`callbacks`对象,其中包含`onImageUpload`事件处理函数。这个函数会在用户尝试上传图片时被调用,它会接收文件对象作为参数,然后通过Ajax或者Fetch API发送到...

    Creator数钱小游戏源码CountMoney.zip

    Creator数钱小游戏源码CountMoney.zip // Learn cc.Class: // - [Chinese] https://docs.cocos.com/creator/manual/zh/scripting/class.html // - [English] ...

    日期时间选择器源码.zip

    - **Callbacks**: 回调接口,当用户完成选择后,会触发这些回调,让应用程序能够获取到选定的日期和时间并进行后续处理。 3. **自定义化**: - 自定义颜色和主题:源码可能提供了设置选择器风格和颜色方案的方法...

    Play midi files and receive notification callbacks to easily

    Play midi files and receive notification callbacks to easily implement repeating music. No special controls needed it’s done through API!

    《Windows设备驱动程序WDF开发》源码

    - **WDF Callbacks**:框架定义的一系列回调函数,驱动程序需要实现这些函数来响应各种事件。 - **Power Management**:WDF提供了电源管理接口,帮助驱动程序遵循系统电源策略。 - **WMI(Windows Management ...

    android Camera源码(可用)

    3. **Picture Callbacks**:在拍摄照片时,Camera API提供了两种回调函数:`onPictureTaken()`,用于处理JPEG格式的照片数据;`onPreviewFrame()`,用于处理预览帧数据。 4. **Preview Frame**:在启动相机预览后,...

    Android 搜索关键字飞入飞出效果源码.zip源码资源下载

    5. **Listener 和 Callbacks**: 在动画执行过程中,可以设置监听器(Listener)以在动画开始、结束或者更新时触发某些操作。例如,可能需要在动画结束后更新UI状态或执行其他逻辑。 6. **布局和视图操作**: 实现飞...

    cocos creator实现的推箱子游戏,含源码和功能;游戏一共有100关卡。pushBox.zip

    cocos creator实现的推箱子游戏,含源码和功能;游戏一共有100关卡。 cc.Class({ extends: cc.Component, properties: { // foo: { // // ATTRIBUTES: // default: null, // The default value will ...

Global site tag (gtag.js) - Google Analytics