`
jjjssh
  • 浏览: 76097 次
  • 性别: 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在内部尝试使用原生的Promise.then和MutationObserver来执行异步队列中的任务,如果执行环境不支持这些特性,会使用setTimeout(fn, 0)来作为替代方案。 Vue.nextTick(callback)是一个非常有用的API,它允许...

    原生js实现vue数据双向绑定.zip

    这个"原生js实现vue数据双向绑定.zip"文件很显然是为了帮助我们理解Vue.js中数据双向绑定背后的原理,并尝试用纯JavaScript来模拟实现这一功能。下面我们将深入探讨Vue的数据绑定机制以及如何用原生JS进行模拟。 ...

    不同js异步函数同步的实现方法

    在复杂的应用场景中,可能需要考虑更加健壮的同步机制,比如使用第三方库或原生的JavaScript异步工具如`async/await`和`Promise.all`等来处理复杂的异步逻辑。 总之,虽然JavaScript的异步特性使得我们可以编写非...

    callbacksjs原生js发布订阅模式的实现参考jquery的callbacks模块

    本文将深入探讨原生JS实现的发布订阅模式,以及如何参考jQuery的callbacks模块来构建类似功能。 首先,我们需要理解回调函数的核心概念。回调函数是一种将函数作为参数传递给另一个函数,然后在适当的时间由该函数...

    05 You Don't Know JS:Async&Performance.pdf

    整体而言,《05 You Don't Know JS:Async & Performance.pdf》是一本系统性地讲解JavaScript异步编程及性能优化的书籍,它不仅涵盖了异步编程的基本概念和高级技术,还包括了JavaScript性能优化的策略和工具。...

    ajax的异步校验功能实现

    在实际项目中,我们可能还需要考虑其他因素,比如防止重复请求、处理异步请求的队列、限制请求频率等。同时,为了提高安全性,服务器端应验证请求来源并防止跨站请求伪造(CSRF)攻击。 总结,通过结合Ajax和jQuery...

    04_vue源码解析21

    Vue内部使用了多种策略来实现异步队列,优先选择原生的Promise.then、MutationObserver或setImmediate。如果这些都不被支持,Vue会退化到使用setTimeout。具体的流程如下: 1. 当数据改变时,对应的`watcher`对象会...

    PHP ajax 异步执行不等待执行结果的处理方法

    例如,可以创建一个队列任务处理快照生成,然后在前端触发任务投递,由队列worker异步执行。 总的来说,PHP与AJAX结合实现异步执行,不等待结果的处理方式,是一种常见的优化用户体验的方法。在实际应用中,开发者...

    前端开源库-promise-queue

    Promise Queue 是一个专门用于解决此类问题的开源库,它允许我们以有序、控制流的方式执行基于Promise的异步任务。这个库的核心理念是通过队列机制限制同时运行的任务数量,从而避免系统资源过度消耗,提高应用性能...

    reactnativeeventbridge在ReactNative和原生之间发送和接收事件

    React Native Event Bridge是React Native框架中的一个重要组成部分,它允许JavaScript(JS)代码与原生iOS或Android代码之间进行通信,从而实现更高效、更复杂的交互。这个技术在混合移动开发中扮演着关键角色,...

    js调用android本地方法的实现

    在现代移动应用开发中,JavaScript(JS)与原生Android平台的交互是常见的需求,尤其在混合应用开发中。JS调用Android本地方法能够利用Web技术的灵活性和原生功能的强大性,为用户提供更好的体验。本篇文章将详细...

    JS和Android

    5. **RNBridge(如React Native的Bridge)**:React Native的Bridge是JS和Android间通信的一种高效方式,它使用异步消息队列来处理JS和Native之间的数据交换,确保了UI的流畅性。 6. **WebSockets或自定义HTTP请求*...

    jsbridge 交互原理图

    JavaScript Bridge(JSBridge)是一种在Web应用与原生应用程序之间建立通信桥梁的技术,它使得JavaScript可以调用原生平台的功能,如访问硬件设备、系统API、处理复杂的计算任务等。在移动开发领域,JSBridge广泛...

    jquery队列queue与原生模仿其实现方法分享

    下面,我将详细阐述这些知识点,并举例说明如何在jQuery中使用queue和dequeue方法,以及如何用原生JavaScript模仿这种行为。 1. jQuery的queue()和dequeue()方法 - queue()方法用于显示或操作在匹配元素上执行的...

    js高级学习 js高级面试

    7. **事件循环与Event Loop**:JavaScript的执行机制由栈和队列组成,事件循环负责从任务队列中取出任务并放入栈中执行。理解事件循环可以帮助解决异步问题和避免回调地狱。 8. **模块系统**:JavaScript原生支持...

    Node.js-基于RubbitMQ的node微服务框架

    Node.js作为一款轻量级、高性能的JavaScript运行环境,非常适合构建微服务。而RabbitMQ作为一种流行的消息队列系统,常被用于微服务间的通信,以实现解耦、异步处理和负载均衡。本项目“Node.js-基于RabbitMQ的Node...

    Node.js-Hivemind–使用AWSLambdafunctions创建分布式作业Job

    综上所述,"Node.js-Hivemind–使用AWS Lambda functions创建分布式作业Job"这个项目结合了Node.js的高效网络编程能力、AWS Lambda的无服务器计算优势以及分布式作业处理的思想,构建了一个灵活、可扩展的云原生解决...

    cbl16888-WebViewJavascriptBridge-master_javascript_

    当JavaScript需要调用原生方法时,会发送一个消息到原生层,原生层接收到消息后执行相应的方法,并将结果通过回调返回给JavaScript。这个过程是异步的,确保了用户界面的流畅性。 ### 4. 使用...

Global site tag (gtag.js) - Google Analytics