我们知道,在适用js的时候,程序是单线程执行的,而且如果遇到阻塞就会将浏览器卡死。

能否异步的执行,让程序不再卡呢?

可以,用setTimeout。

但是,问题又来了,如果我有这样的要求:

执行一个函数a;

暂停5秒;

执行函数b;

暂停5秒;

输出结果,暂停5秒后自动清空显示。

以上的这段逻辑伪代码使用JavaScript难以直接实现,因为setTimeout的时候,你根本不知道他什么时候执行结束。

jQuery有when方法可以解决问题,但是其嵌套性又让人伤神。

为此,我造了一个简单的轮子,发布出来,与开源社区共享。

轮子代码:

/**
*
* @authors sunsoft (sunruiyeyipeng@163.com)
* @date 2015-04-30 22:26:22
* @version v1.0
*/
function Executor() {
return {
oSequence: [],
Params: {},
microInterval: 10,
add: function(func, delay) {
var that = this;
var option = {
delayInit: delay,
startDateTime: null,
state: "wait",
delegateFunc: func,
done: function() {
this.state = "done";
},
getParam: function(paramname) {
return that.Params[paramname];
},
setParam: function(paramname, value) {
that.Params[paramname] = value;
}
};
this.oSequence.push(option);
},
exec: function() {
this.oSequence.reverse();
var that = this;
//active the first one
this.oSequence[that.oSequence.length - 1].startDateTime = new Date();
var fTmp = function() {
if (that.oSequence.length > 0) {
var oTask = that.oSequence[that.oSequence.length - 1];
if (oTask.state == "done") {
//如果任务已经完成,就删除这个节点
that.oSequence.pop();
//如果还有下一个节点,则将它的开始时间设置好
if (that.oSequence.length > 0) {
oTask = that.oSequence[that.oSequence.length - 1];
oTask.startDateTime = new Date();
}
}
if (oTask.state == "wait" && oTask.startDateTime != null && (new Date()) - oTask.startDateTime > oTask.delayInit) {
oTask.state = "processing";
oTask.delegateFunc(oTask);
}
setTimeout(fTmp, that.microInterval);
} else {
console.log("done");
}
}
fTmp();
},
sleep: function(millSec) {
this.add(function(task) {
task.done();
}, millSec);
}
};
}

测试代码:

$(document).ready(function() {
examples();
}); function examples() {
var oExecutor = new Executor();
oExecutor.microInterval = 1;
oExecutor.add(function(task) {
//alert("we are the world");
console.log((new Date()).toLocaleString())
task.setParam("love","MJ");
task.done();
}, 0);
oExecutor.sleep(2000);
oExecutor.add(function(task) {
console.log((new Date()).toLocaleString())
//alert("我又来了");
console.log(task.getParam("love"));
task.done();
}, 0);
oExecutor.exec();
}

[JavaScript]顺序的异步执行的更多相关文章

  1. 浅谈个人对客户端JavaScript同步、异步、执行顺序等概念的理解

    一.同步和异步的概念. 同步:即按代码的顺序执行任务. 在下列代码中,按照同步概念,则是先打印1后打印2. console.log(1); console.log(2); 异步:即执行一个任务的同时执 ...

  2. 对Javascript异步执行的理解

    简单的查看了下Javascript异步编程的代码.按照网上的说法,Javascript异步编程的核心就在于setTimeout.这个系统函数让我们将函数的执行放在了一个指定的新“线程”中.于是本来的顺 ...

  3. 关于JavaScript预编译和执行顺序以及函数引用类型的思考

    昨晚在对项目中的一部分做模块化处理的时候,遇到了一个问题,一个重新定义的function对一个通用类中的function进行赋值覆盖的时候,失败了.问题抽象出来是这样的: <script > ...

  4. js 异步执行顺序

    参考文章: js 异步执行顺序   1.js的执行顺序,先同步后异步 2.异步中任务队列的执行顺序: 先微任务microtask队列,再宏任务macrotask队列 3.调用Promise 中的res ...

  5. 昼猫笔记 JavaScript -- 异步执行 | 定时器真的定时执行?

      本篇主要内容:异步.定时器引发的思考 预计阅读时间:8分钟 了解 我们都知道在js中定时器有两种  setInterval()  . setTimeout()   setInterval() :按 ...

  6. 高性能JavaScript 加载和执行

    前言 本章主要讲述如何加载脚本使得用户能有良好的用户体验,而核心内容就是JavaScript的异步加载.之前写过一篇不得不说的JavaScript异步加载,相似的内容就不多加描述,讲些不同的东西,主要 ...

  7. javascript延迟加载及异步(defer和async)

    一直以来写代码的时候的常用习惯就是吧所有的js文件直接加载在文档的head标签里面,在写js文件的时候有时候获取一些文件对象的时候为空对象,这是由于文档结构还没有加载完,但是js文件已经加载完.也就是 ...

  8. 怎么样加快JavaScript加载和执行效率

    概览 无论当前 JavaScript 代码是内嵌还是在外链文件中,页面的下载和渲染都必须停下来等待脚本执行完成.JavaScript 执行过程耗时越久,浏览器等待响应用户输入的时间就越长.浏览器在下载 ...

  9. 【转】JavaScript 的装载和执行

    承接前面一篇文章<浏览器的渲染原理简介> ,本文来说下JavaScript的装载和执行. 通常来说,浏览器对于 JavaScript 的运行有两大特性: 1) 载入后马上执行 2) 执行时 ...

随机推荐

  1. SQL Server 2008 R2 未能加载文件或程序集Microsoft.SqlServer.Sqm...

    错误提示:未能加载文件或程序集“Microsoft.SqlServer.Sqm, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8 ...

  2. HTML5视频Video 音频Audio

    视频协议 视频格式 Flash HTML5 HTTP flv HTTP f4v HTTP mp4 HTTP m3u8 HTTP webm HTTP ogg RTMP flv RTMP f4v RTMP ...

  3. ORACLE 数据库 MOD 函数用法

    1.求2和1的余数. Select mod(2,1) from dual: 2能被1整除所以余数为0. 2.MOD(x,y)返回X除以Y的余数.如果Y是0,则返回X的值. Select mod(2,0 ...

  4. KSImageNamed 安装后无效解决方法

    UIImage的imageNamed提供文件名自动补全功能.使用[UIImage imageNamed:@"xxx"]时,该插件会扫描整个workspace中的图片文件.若安装后无 ...

  5. 记录并分享一下安卓通讯录导入到IPhone

    仅仅记录一下我自己的步骤: 前提:我开始用的是诺基亚1202,黑白屏的功能机: 1.将卡放到安卓手机里面,用应用宝导出全部联系人为VCF后缀文件: 2.下载ITools,用它连接IPhone,导入到I ...

  6. 刷题ING...

    我用codeVS刷题.. 努力准备!!

  7. js前台加密,java后台解密实现

    参考资料: JS前台加密,java后台解密实现

  8. JavaScript 介绍

          JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 ...

  9. 副本限制修改-M端

    魔兽的副本很多,也有很多副本都有进入的限制,比方说最普遍的,有些副本有级别限制,没达到要求的级别是不能进入对应副本的还有些副本是有任务需求限制,比方说黑翼副本,需要做完一个任务之后才可以进入副本当然, ...

  10. login

    package addresslist; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.event.Act ...