`
seavers
  • 浏览: 172349 次
  • 来自: ...
社区版块
存档分类
最新评论

sync.js

阅读更多
自己写了一个小工具, 做个备份

支持addTask任务, 每个任务将会同步执行


引用
sync.js

/*** 
 *   Sync 框架
 *
 *   支持 addTask,  addCirle,  addListener,  finish 等功能
 *
 */
(function() {

	var MAX_TOTAL = Math.pow(2, 31);

	function Sync(delay) {
		this.delay = delay;
		this.queue = [];			//执行队列
		this.listeners = [];			//listeners
		this.timer = 0;
		this.count = 0;				//总的计数
	}

	Sync.prototype.setDelay = function(delay) {
		this.delay = delay;
		return this;
	}

	Sync.prototype.addListener = function(func) {
		this.listeners.push(func);
		return this;
	}

	Sync.prototype.removeListener = function(func) {
		var pos = this.listeners.indexOf(func)
		if (pos != -1) {
			this.listeners.splice(pos);
		}
		return this;
	}

	Sync.prototype.addTask = function(func, callback) {
		this.addCircle(1, func, callback);
		return this;
	}

	Sync.prototype.addParallelTask = function(/** func1, func2, func3...  **/) {
		this.addCircle(1, function(index) {
			for(var i = 0; i < arguments.length; i++) {
				var func = arguments[i];
				func(index);
			}
		});
		return this;
	}

	Sync.prototype.addCircle = function(total, func, callback) {
		if (typeof(total) == 'function') {
			func = total;
			total = MAX_TOTAL;
		}
		this.queue.push({
			func : func, 
			total : total,
			index : 0,
			callback : callback
		});
		this.checkStart();
		return this;
	}

	Sync.prototype.checkStart = function(total, func) {
		if (this.timer) {
			return;
		}
		var that = this;
		this.timer = setTimeout(function() {
			var task = that.queue[0];
			if (!task) {
				that.timer = 0;
				return ;
			}
			var ret = that._execute(task, task.index);
			if (ret === true || ++task.index >= task.total) {
				that.queue.shift();
				that._callback(task);
			}
			that.timer = setTimeout(arguments.callee, that.delay);			
		}, this.delay);
	}

	Sync.prototype._execute = function(task, index) {
		var ret = task.func(index);
		for(var i = 0; i < this.listeners.length; i++) {
			this.listeners[i](this.count++);
		}
	}

	Sync.prototype._callback = function(task) {
		task.callback && task.callback(index);
	}

	Sync.prototype.finish = function(bool) {
		if (this.timer) {
			clearTimeout(this.timer);
			this.timer = 0;
		}
		if (bool === undefined || bool === true) {
			for(var i = 0; i < this.queue.length; i++) {
				var task = this.queue[i];
				for(var j = task.index; j < task.total; j++) {
					var ret = this._execute(task, j);
					if (ret === true) {
						break;
					}
				}
				
			}
		}
		this.queue = [];
	}


	window.Sync = Sync;


})();




index.htm:
<script src="sync.js"></script>
<script>

	var a = new Sync(1000);
	a.addListener(function(n){console.log('notify .' + n)});
	a.addCircle(2, function(n) {console.log('execute 2 -- ' + n)});
	a.addCircle(4, function(n) {console.log('execute 4 -- ' + n)});
	a.addCircle(8, function(n) {console.log('execute 8 -- ' + n)});
	setTimeout(function() {
		a.addCircle(function(n) {console.log('execute n -- ' + n)});
		setTimeout(function() {
			a.finish();
		}, 3000);
	}, 3000);

</script>



分享到:
评论

相关推荐

    backbone.sync.js

    在Web开发的世界里,Backbone.js是一个流行的JavaScript库,用于构建MVC(Model-View-Controller)结构的应用程序。它提供了一种组织代码的方式,使得前端逻辑更加清晰。而`backbone.sync.js`是Backbone的一个关键...

    require-sync.js:用于加载内联脚本的同步浏览器资源加载器。 不是 AMD 而是 SMD(同步模块定义)

    需要同步 基于 AMD 模式的同步模块加载器。 这意味着您可以内联加载内容 - 如果必须的话 - 例如 [removed][removed] [removed] // In AMD you would have had to wrap this in a `... bower install require-sync

    sqlite-sync.js:节点模块到 sqlite 同步和异步

    sqlite-sync.js 节点模块到 sqlite 同步和异步 node.js 包,用于与SQLite连接数据库,并同步或异步执行 SQL 命令。 安装 npm install sqlite-sync 用法 var sqlite = require ( 'sqlite-sync' ) ; //requiring //...

    knockout.sync.js:同步库管理模型,以便在设备和后端之间同步

    Knockout.sync.js 是一种扩展,使您可以集中管理并在客户端和后端之间同步视图模型及其所有业务逻辑。 介绍 您想推出新版本的与Viewmodel相关的功能/计算/验证规则,而不必强迫用户重新启动? 客户端可能同时使用多...

    前端开源库-sync.zip

    "前端开源库-sync.zip"这个压缩包很可能包含了一些常用的前端开发库,这些库可能涵盖了JavaScript、CSS、HTML以及相关的框架和工具。在这里,我们将深入探讨一些常见的前端开源库及其在实际开发中的应用。 1. **...

    Ajax-react-sync.zip

    Ajax-react-sync.zip,通过react高阶组件获取数据的声明性方法,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页,其中网页的小部分在不重新加载网页...

    Vue.js前端开发实战-源代码.zip

    Vue.js 是一款轻量级的前端JavaScript框架,由尤雨溪开发并维护,以其易学易用、高性能、灵活的组件系统以及强大的生态系统而受到广大开发者喜爱。本资源"Vue.js前端开发实战-源代码.zip"是针对Vue.js的学习资料,...

    .github-workflows-ziye-sync.yml

    `actions/upload-artifact`(上传构建结果),`actions/download-artifact`(下载构建结果),`actions/github-script`(运行JavaScript脚本与GitHub API交互)等。 6. **安全性和权限**: - 在GitHub Actions中,...

    Node.js-exec-file-sync-Node.js0.12childProcess.execFileSync()ponyfill

    在JavaScript中,polyfill是一种特殊类型的库,它模拟了现代浏览器或新版本Node.js中未在旧环境中实现的API。`execFileSync()` ponyfill是为了在不支持这个方法的老版本Node.js环境中提供相同功能的代码,使得开发者...

    wow.min.js动画插件

    Wow.js是javascript动画插件,经常配合animate.css一起使用。动画效果会在元素第一次出现在页面中时起作用。 引入wow.js 在需要使用的元素上添加class=”wow” 使用js初始化

    Leaflet.Sync:两张地图的同步视图

    使用npm进行npm install leaflet.sync (和require('leaflet.sync') ),或者只是下载L.Map.Sync.js并在您的html中添加脚本标签。 用法 两张地图。 使用两个地图对象mapA和mapB ,调用mapA.sync(mapB)将mapA.sync...

    01-sync-mode.js

    01-sync-mode.js

    Backbone.js(1.1.2) API中文文档.zip Backbone.js离线文档

    Backbone.js是一款轻量级的JavaScript库,专为构建丰富的Web应用程序而设计。它通过提供模型(Models)、视图(Views)、集合(Collections)和路由器(Routers)等核心概念,帮助开发者组织代码并实现MVC(Model-...

    prompt-sync, node.js的同步提示.zip

    prompt-sync, node.js的同步提示 概要node的同步提示。 非常简单。没有 C 绑定和bash脚本。在 Linux,OS X 和 Windows 上工作。基本模式var prompt = require('prompt-sync')();////

    hls.min.js

    return e.d(r,"a",r),r},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="/hls.js/dist/",e(e.s=7)}([function(t,e,r){"use strict";function i(){}function a(t,e){return e="["+t+"] &gt;...

    vue.js+node.js毕业设计.zip

    4. **指令与修饰符**:Vue.js提供了丰富的指令(如v-if、v-for、v-bind等)和修饰符(如.sync、.once等),简化了对DOM的操作。 5. **状态管理(Vuex)**:在大型项目中,Vuex通常用于管理组件间的共享状态,保证...

    Smart.js:一个聪明的轻量级 Node.js Web 框架

    一个聪明的 Node.js Web 框架这个框架的主要目的是约定优于配置,它的灵感来自 Ember.js 或 Ruby On Rails。 它遵循MVC设计模式。 没有更多的依赖项我不喜欢具有数千个依赖项的项目,这就是为什么 Smart 不使用除 ...

    Node.js — 概念1

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,由 Ryan Dahl 在2009年创建。它让开发者能够在服务器端使用 JavaScript 编程,打破了 JavaScript 仅限于客户端脚本语言的传统定位,极大地扩展了其应用...

    SmartSync文件同步工具

    完全可用的SmartSync; 支持本地、网络文件夹同步

    useDosbox

    Dosbox的React钩子快速开始在线托管dosbox-sync.js和dosbox.html.mem(来自公共文件夹)。 这两个文件需要托管在同一位置。 在线托管dosgame文件安装包npm install usedosboxoryarn add usedosbox 更新您的React组件...

Global site tag (gtag.js) - Google Analytics