自己写了一个小工具, 做个备份
支持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>
分享到:
相关推荐
需要同步 基于 AMD 模式的同步模块加载器。 这意味着您可以内联加载内容 - 如果必须的话 - 例如 [removed][removed] [removed] // In AMD you would have had to wrap this in a `... bower install require-sync
sqlite-sync.js 节点模块到 sqlite 同步和异步 node.js 包,用于与SQLite连接数据库,并同步或异步执行 SQL 命令。 安装 npm install sqlite-sync 用法 var sqlite = require ( 'sqlite-sync' ) ; //requiring //...
bone.sync.js 取自 设置Django和骨干网之间的同步
Knockout.sync.js 是一种扩展,使您可以集中管理并在客户端和后端之间同步视图模型及其所有业务逻辑。 介绍 您想推出新版本的与Viewmodel相关的功能/计算/验证规则,而不必强迫用户重新启动? 客户端可能同时使用多...
Ajax-react-sync.zip,通过react高阶组件获取数据的声明性方法,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页,其中网页的小部分在不重新加载网页...
使用npm进行npm install leaflet.sync (和require('leaflet.sync') ),或者只是下载L.Map.Sync.js并在您的html中添加脚本标签。 用法 两张地图。 使用两个地图对象mapA和mapB ,调用mapA.sync(mapB)将mapA.sync...
exec-file-sync - Node.js 0.12 childProcess.execFileSync() ponyfill
01-sync-mode.js
prompt-sync, node.js的同步提示 概要node的同步提示。 非常简单。没有 C 绑定和bash脚本。在 Linux,OS X 和 Windows 上工作。基本模式var prompt = require('prompt-sync')();////
一个聪明的 Node.js Web 框架这个框架的主要目的是约定优于配置,它的灵感来自 Ember.js 或 Ruby On Rails。 它遵循MVC设计模式。 没有更多的依赖项我不喜欢具有数千个依赖项的项目,这就是为什么 Smart 不使用除 ...
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+"] >...
完全可用的SmartSync; 支持本地、网络文件夹同步
Dosbox的React钩子快速开始在线托管dosbox-sync.js和dosbox.html.mem(来自公共文件夹)。 这两个文件需要托管在同一位置。 在线托管dosgame文件安装包npm install usedosboxoryarn add usedosbox 更新您的React组件...
项目中的文件“pako_inflate.js”、“dictzip.js”和“dictzip_sync.js”。 如果要运行演示代码,请将这些文件的版本复制到演示目录中。 文档:同步接口 使用importScripts将 stardict_sync.js 导入到您的 worker 的...
Sync.js 这是一个不可知的javascript库,可在整个应用中同步共享数据/状态。 它很小,不受限制,可以与Redux交互和/或替换。 可以轻松扩展它以与API或Firebase或pubnub等协调。 它针对高性能和低占地面积进行了优化...
XDCScan资源管理器 本地安装 克隆仓库 如果没有 ,请下载它们 安装依赖项: npm install ... 您可以让sync.js在不使用app.js的情况下运行,它将基于config.json参数node ./tools/sync.js同步并获取块
redis-sync实现SYNC命令的复制从属端,并在修改数据集的所有命令SYNC式传输。 它还可以使用解析命令之前的数据集转储。 如果无法连接,断开连接或redis仍在加载数据集,则redis-sync将继续尝试重新连接-指数回退。...
将default_config.js复制到名为spreadsheet_sync_config.js default_config.js的新文件 $ cp default_config.js spreadsheet_sync_config.js 打开电子表格_sync_config.js, 编辑 mongoDb 相关信息。 (Meteor默认...
单机版要安装Remote Sync DS以供全球使用,请输入以下命令进行安装sudo npm -g install remote-sync-ds 基于项目将Remote Sync DS添加到使用“ remote-sync”的任何项目中(查找名为.remote-sync.json的文件),然后...
主干。脏同步创建Backbone.sync方法的...用作浏览器全局您可以直接在script标记中包含backbone.dirty-sync.js 。 确保在下划线和主干之后加载它。 它将使用抽象覆盖默认的Backbone.sync 。 < script src =" undersco