`
jjjssh
  • 浏览: 74105 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

原生js异步队列任务

阅读更多
场景:有不同的ajax在请求数据,返回后,把该执行的东西,做成一个任务,放到队列中,然后排队执行

所以想做一个任务队列,后续可能还要做一个多消费者订阅消费的模式,现在先出一个简单的任务队列

<html>
<head>
<title>Js Async Queue</title>
<script>
var AsyncQueue={
	queue:[],
	init:function(){
		window.addEventListener("message",function(e){
			//只响应AsyncQueue的召唤
			if(e.data==="AsyncQueue"){
				e.stopPropagation();//阻止事件冒泡
				if(AsyncQueue.queue.length>0){
					//执行并删除队列中的第一个
					var _task=AsyncQueue.queue.shift();
					_task.excute(_task.data);
				}
				
			}
		},true);
	},
	addTask:function(task){
		//添加到队列
		AsyncQueue.queue.push(task);
		window.postMessage("AsyncQueue","*");
	}
}

//初始化队列
AsyncQueue.init();

for(var i=0;i<10;i++){
	var _task={
		data:{name:i},
		excute:function(param){
			//模拟后台请求
			var _tt=Math.random()*1000;//因为有些业务快,有些业务慢
			document.getElementById("id"+param.name).innerHTML="任务执行中.....";
			setTimeout(function(){
				console.info(param.name);
				document.getElementById("id"+param.name).innerHTML="任务完成";
			},_tt);
			
		}
	}
	AsyncQueue.addTask(_task);
}

//模拟隔一段时间再加入的任务
setTimeout(function(){
	var _uuid="test0001";
	var oDiv=document.createElement('div');
	oDiv.id=_uuid;
	oDiv.style="width:100px;height:100px;border:1px solid #000;margin:5px;float:left;";
	
	var container =document.getElementById('id9');
	var node=container.nextSibling;
	container.parentNode.insertBefore(oDiv, node);
	
	var _task={
		data:{name:_uuid},
		excute:function(param){
			//模拟后台请求
			var _tt=Math.random()*1000;//因为有些业务快,有些业务慢
			document.getElementById(param.name).innerHTML="任务执行中.....";
			setTimeout(function(){
				console.info(param.name);
				document.getElementById(param.name).innerHTML="任务完成";
			},_tt);
			
		}
	}
	AsyncQueue.addTask(_task);
},6000);

</script>
</head>
<body>
<div>Hello Js Async Queue</div>
<div id="id0" style="width:100px;height:100px;border:1px solid #000;margin:5px;float:left;"></div>
<div id="id1" style="width:100px;height:100px;border:1px solid #000;margin:5px;float:left;"></div>
<div id="id2" style="width:100px;height:100px;border:1px solid #000;margin:5px;float:left;"></div>
<div id="id3" style="width:100px;height:100px;border:1px solid #000;margin:5px;float:left;"></div>
<div id="id4" style="width:100px;height:100px;border:1px solid #000;margin:5px;float:left;"></div>
<div id="id5" style="width:100px;height:100px;border:1px solid #000;margin:5px;float:left;"></div>
<div id="id6" style="width:100px;height:100px;border:1px solid #000;margin:5px;float:left;"></div>
<div id="id7" style="width:100px;height:100px;border:1px solid #000;margin:5px;float:left;"></div>
<div id="id8" style="width:100px;height:100px;border:1px solid #000;margin:5px;float:left;"></div>
<div id="id9" style="width:100px;height:100px;border:1px solid #000;margin:5px;float:left;"></div>
</body>
</html>



分享到:
评论

相关推荐

    浅谈Vuejs中nextTick()异步更新队列源码解析

    vue官网关于此解释说明如下: vue2.0里面的深入响应式原理的异步更新...Vue 在内部尝试对异步队列使用原生的 Promise.then 和 MutationObserver,如果执行环境不支持,会采用 setTimeout(fn, 0) 代替。 例如,当你设置

    mpvue-maizuo:mpvue+scss+flyio.js......卖座网小程序

    支持请求队列,支持对原生API进行拦截。 # install dependencies npm install # serve with hot reload at localhost:8080 npm run dev # build for production with minification npm run build # build for ...

    java开源包1

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包11

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包2

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包3

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包6

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包5

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包10

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包4

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包8

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包7

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包9

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包101

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    Java资源包01

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    JAVA上百实例源码以及开源项目源代码

    JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个目标文件 摘要:Java源码,网络相关,浏览器  Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML浏览器...

    JAVA上百实例源码以及开源项目

    JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个目标文件 摘要:Java源码,网络相关,浏览器  Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML浏览器...

Global site tag (gtag.js) - Google Analytics