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

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

可以,用setTimeout。

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

执行一个函数a;

暂停5秒;

执行函数b;

暂停5秒;

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

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

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

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

轮子代码:

  1. /**
  2. *
  3. * @authors sunsoft (sunruiyeyipeng@163.com)
  4. * @date 2015-04-30 22:26:22
  5. * @version v1.0
  6. */
  7. function Executor() {
  8. return {
  9. oSequence: [],
  10. Params: {},
  11. microInterval: 10,
  12. add: function(func, delay) {
  13. var that = this;
  14. var option = {
  15. delayInit: delay,
  16. startDateTime: null,
  17. state: "wait",
  18. delegateFunc: func,
  19. done: function() {
  20. this.state = "done";
  21. },
  22. getParam: function(paramname) {
  23. return that.Params[paramname];
  24. },
  25. setParam: function(paramname, value) {
  26. that.Params[paramname] = value;
  27. }
  28. };
  29. this.oSequence.push(option);
  30. },
  31. exec: function() {
  32. this.oSequence.reverse();
  33. var that = this;
  34. //active the first one
  35. this.oSequence[that.oSequence.length - 1].startDateTime = new Date();
  36. var fTmp = function() {
  37. if (that.oSequence.length > 0) {
  38. var oTask = that.oSequence[that.oSequence.length - 1];
  39. if (oTask.state == "done") {
  40. //如果任务已经完成,就删除这个节点
  41. that.oSequence.pop();
  42. //如果还有下一个节点,则将它的开始时间设置好
  43. if (that.oSequence.length > 0) {
  44. oTask = that.oSequence[that.oSequence.length - 1];
  45. oTask.startDateTime = new Date();
  46. }
  47. }
  48. if (oTask.state == "wait" && oTask.startDateTime != null && (new Date()) - oTask.startDateTime > oTask.delayInit) {
  49. oTask.state = "processing";
  50. oTask.delegateFunc(oTask);
  51. }
  52. setTimeout(fTmp, that.microInterval);
  53. } else {
  54. console.log("done");
  55. }
  56. }
  57. fTmp();
  58. },
  59. sleep: function(millSec) {
  60. this.add(function(task) {
  61. task.done();
  62. }, millSec);
  63. }
  64. };
  65. }

测试代码:

  1. $(document).ready(function() {
  2. examples();
  3. });
  4.  
  5. function examples() {
  6. var oExecutor = new Executor();
  7. oExecutor.microInterval = 1;
  8. oExecutor.add(function(task) {
  9. //alert("we are the world");
  10. console.log((new Date()).toLocaleString())
  11. task.setParam("love","MJ");
  12. task.done();
  13. }, 0);
  14. oExecutor.sleep(2000);
  15. oExecutor.add(function(task) {
  16. console.log((new Date()).toLocaleString())
  17. //alert("我又来了");
  18. console.log(task.getParam("love"));
  19. task.done();
  20. }, 0);
  21. oExecutor.exec();
  22. }

[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. C#中页面之间跳转方法比较

    一直以来,各种跳转方法混用,浑浑噩噩没有仔细去了解过每个跳转方法的区别 1.<a herf="default.asp"></a>  超链接跳转 2.< ...

  2. 【转】JavaScript获取节点类型、节点名称和节点值

    DOM节点信息包括节点类型(nodeType).节点名称(nodeName)和节点值(nodeValue). 节点类型 DOM节点中,每个节点都拥有不同的类型.W3C规范中常用的 DOM节点类型有以下 ...

  3. 作业三:WC项目

    WC一个简单的文件检测系统 用c语言实现 不多说 上代码 #include<stdio.h> #include<stdlib.h> #include <io.h> ...

  4. 【我是老中医】VMware在win8.1下开Ubuntu提示”内部错误"解决方案

    这个题目起得很洋气啊,其实问题也比较好解决,但是我想多码几个字!!! 友情提示:如果不想看废话,请直接看最后的红字! 好的,咱们从头说(废话)起.话说我们学院每年都会组织大三的进行校企联合实训(其实就 ...

  5. PHP比较操作符详解(转自hack58)

    php的比较操作符有==(等于)松散比较,===(完全等于)严格比较,这里面就会引入很多有意思的问题. 在松散比较的时候,php会将他们的类型统一,比如说字符到数字,非bool类型转换成bool类型, ...

  6. mysql学习之触发器

    在借阅表和读者表当中存在着这样的关系,如果在借阅表当中添加一条数据,读者表当中对应的累计借书字段就自增1,如果在借阅表当中删除一条数据,读者表当中对应的累计借书字段就自减1,实现本功能的方法如下. 1 ...

  7. o-sync-and-o-direct

    https://lwn.net/Articles/457667/ https://lwn.net/Articles/457667/ https://lwn.net/Articles/457667/ h ...

  8. fastdfs-nginx扩展模块源码分析

    FastDFS-Nginx扩展模块源码分析 1. 背景 在大多数业务场景中,往往需要为FastDFS存储的文件提供http下载服务,而尽管FastDFS在其storage及tracker都内置了htt ...

  9. python---map,filter,reduce

    map 遍历序列,对序列中每个元素进行操作,最终获取新的序列. li = [11, 22, 33] new_list = map(lambda a: a + 100, li) #new_list = ...

  10. 1001. 害死人不偿命的(3n+1)猜想 (15)

    1001. 害死人不偿命的(3n+1)猜想 (15) 较简单,直接代码实现: #include <cstdio> int main() { int n; scanf("%d&qu ...