[JavaScript]顺序的异步执行
我们知道,在适用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]顺序的异步执行的更多相关文章
- 浅谈个人对客户端JavaScript同步、异步、执行顺序等概念的理解
一.同步和异步的概念. 同步:即按代码的顺序执行任务. 在下列代码中,按照同步概念,则是先打印1后打印2. console.log(1); console.log(2); 异步:即执行一个任务的同时执 ...
- 对Javascript异步执行的理解
简单的查看了下Javascript异步编程的代码.按照网上的说法,Javascript异步编程的核心就在于setTimeout.这个系统函数让我们将函数的执行放在了一个指定的新“线程”中.于是本来的顺 ...
- 关于JavaScript预编译和执行顺序以及函数引用类型的思考
昨晚在对项目中的一部分做模块化处理的时候,遇到了一个问题,一个重新定义的function对一个通用类中的function进行赋值覆盖的时候,失败了.问题抽象出来是这样的: <script > ...
- js 异步执行顺序
参考文章: js 异步执行顺序 1.js的执行顺序,先同步后异步 2.异步中任务队列的执行顺序: 先微任务microtask队列,再宏任务macrotask队列 3.调用Promise 中的res ...
- 昼猫笔记 JavaScript -- 异步执行 | 定时器真的定时执行?
本篇主要内容:异步.定时器引发的思考 预计阅读时间:8分钟 了解 我们都知道在js中定时器有两种 setInterval() . setTimeout() setInterval() :按 ...
- 高性能JavaScript 加载和执行
前言 本章主要讲述如何加载脚本使得用户能有良好的用户体验,而核心内容就是JavaScript的异步加载.之前写过一篇不得不说的JavaScript异步加载,相似的内容就不多加描述,讲些不同的东西,主要 ...
- javascript延迟加载及异步(defer和async)
一直以来写代码的时候的常用习惯就是吧所有的js文件直接加载在文档的head标签里面,在写js文件的时候有时候获取一些文件对象的时候为空对象,这是由于文档结构还没有加载完,但是js文件已经加载完.也就是 ...
- 怎么样加快JavaScript加载和执行效率
概览 无论当前 JavaScript 代码是内嵌还是在外链文件中,页面的下载和渲染都必须停下来等待脚本执行完成.JavaScript 执行过程耗时越久,浏览器等待响应用户输入的时间就越长.浏览器在下载 ...
- 【转】JavaScript 的装载和执行
承接前面一篇文章<浏览器的渲染原理简介> ,本文来说下JavaScript的装载和执行. 通常来说,浏览器对于 JavaScript 的运行有两大特性: 1) 载入后马上执行 2) 执行时 ...
随机推荐
- C#中页面之间跳转方法比较
一直以来,各种跳转方法混用,浑浑噩噩没有仔细去了解过每个跳转方法的区别 1.<a herf="default.asp"></a> 超链接跳转 2.< ...
- 【转】JavaScript获取节点类型、节点名称和节点值
DOM节点信息包括节点类型(nodeType).节点名称(nodeName)和节点值(nodeValue). 节点类型 DOM节点中,每个节点都拥有不同的类型.W3C规范中常用的 DOM节点类型有以下 ...
- 作业三:WC项目
WC一个简单的文件检测系统 用c语言实现 不多说 上代码 #include<stdio.h> #include<stdlib.h> #include <io.h> ...
- 【我是老中医】VMware在win8.1下开Ubuntu提示”内部错误"解决方案
这个题目起得很洋气啊,其实问题也比较好解决,但是我想多码几个字!!! 友情提示:如果不想看废话,请直接看最后的红字! 好的,咱们从头说(废话)起.话说我们学院每年都会组织大三的进行校企联合实训(其实就 ...
- PHP比较操作符详解(转自hack58)
php的比较操作符有==(等于)松散比较,===(完全等于)严格比较,这里面就会引入很多有意思的问题. 在松散比较的时候,php会将他们的类型统一,比如说字符到数字,非bool类型转换成bool类型, ...
- mysql学习之触发器
在借阅表和读者表当中存在着这样的关系,如果在借阅表当中添加一条数据,读者表当中对应的累计借书字段就自增1,如果在借阅表当中删除一条数据,读者表当中对应的累计借书字段就自减1,实现本功能的方法如下. 1 ...
- o-sync-and-o-direct
https://lwn.net/Articles/457667/ https://lwn.net/Articles/457667/ https://lwn.net/Articles/457667/ h ...
- fastdfs-nginx扩展模块源码分析
FastDFS-Nginx扩展模块源码分析 1. 背景 在大多数业务场景中,往往需要为FastDFS存储的文件提供http下载服务,而尽管FastDFS在其storage及tracker都内置了htt ...
- python---map,filter,reduce
map 遍历序列,对序列中每个元素进行操作,最终获取新的序列. li = [11, 22, 33] new_list = map(lambda a: a + 100, li) #new_list = ...
- 1001. 害死人不偿命的(3n+1)猜想 (15)
1001. 害死人不偿命的(3n+1)猜想 (15) 较简单,直接代码实现: #include <cstdio> int main() { int n; scanf("%d&qu ...