场景:有不同的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>
分享到:
相关推荐
Vue在内部尝试使用原生的Promise.then和MutationObserver来执行异步队列中的任务,如果执行环境不支持这些特性,会使用setTimeout(fn, 0)来作为替代方案。 Vue.nextTick(callback)是一个非常有用的API,它允许...
这个"原生js实现vue数据双向绑定.zip"文件很显然是为了帮助我们理解Vue.js中数据双向绑定背后的原理,并尝试用纯JavaScript来模拟实现这一功能。下面我们将深入探讨Vue的数据绑定机制以及如何用原生JS进行模拟。 ...
在复杂的应用场景中,可能需要考虑更加健壮的同步机制,比如使用第三方库或原生的JavaScript异步工具如`async/await`和`Promise.all`等来处理复杂的异步逻辑。 总之,虽然JavaScript的异步特性使得我们可以编写非...
本文将深入探讨原生JS实现的发布订阅模式,以及如何参考jQuery的callbacks模块来构建类似功能。 首先,我们需要理解回调函数的核心概念。回调函数是一种将函数作为参数传递给另一个函数,然后在适当的时间由该函数...
整体而言,《05 You Don't Know JS:Async & Performance.pdf》是一本系统性地讲解JavaScript异步编程及性能优化的书籍,它不仅涵盖了异步编程的基本概念和高级技术,还包括了JavaScript性能优化的策略和工具。...
在实际项目中,我们可能还需要考虑其他因素,比如防止重复请求、处理异步请求的队列、限制请求频率等。同时,为了提高安全性,服务器端应验证请求来源并防止跨站请求伪造(CSRF)攻击。 总结,通过结合Ajax和jQuery...
Vue内部使用了多种策略来实现异步队列,优先选择原生的Promise.then、MutationObserver或setImmediate。如果这些都不被支持,Vue会退化到使用setTimeout。具体的流程如下: 1. 当数据改变时,对应的`watcher`对象会...
例如,可以创建一个队列任务处理快照生成,然后在前端触发任务投递,由队列worker异步执行。 总的来说,PHP与AJAX结合实现异步执行,不等待结果的处理方式,是一种常见的优化用户体验的方法。在实际应用中,开发者...
Promise Queue 是一个专门用于解决此类问题的开源库,它允许我们以有序、控制流的方式执行基于Promise的异步任务。这个库的核心理念是通过队列机制限制同时运行的任务数量,从而避免系统资源过度消耗,提高应用性能...
React Native Event Bridge是React Native框架中的一个重要组成部分,它允许JavaScript(JS)代码与原生iOS或Android代码之间进行通信,从而实现更高效、更复杂的交互。这个技术在混合移动开发中扮演着关键角色,...
在现代移动应用开发中,JavaScript(JS)与原生Android平台的交互是常见的需求,尤其在混合应用开发中。JS调用Android本地方法能够利用Web技术的灵活性和原生功能的强大性,为用户提供更好的体验。本篇文章将详细...
5. **RNBridge(如React Native的Bridge)**:React Native的Bridge是JS和Android间通信的一种高效方式,它使用异步消息队列来处理JS和Native之间的数据交换,确保了UI的流畅性。 6. **WebSockets或自定义HTTP请求*...
JavaScript Bridge(JSBridge)是一种在Web应用与原生应用程序之间建立通信桥梁的技术,它使得JavaScript可以调用原生平台的功能,如访问硬件设备、系统API、处理复杂的计算任务等。在移动开发领域,JSBridge广泛...
- **异步并发**:ArkTS支持标准的JavaScript异步并发机制,如`Promise`和`async/await`等。这些机制使得开发者能够轻松编写非阻塞代码,提高程序的响应性和效率。 - **多线程并发**: - **TaskPool**:提供了一个多...
下面,我将详细阐述这些知识点,并举例说明如何在jQuery中使用queue和dequeue方法,以及如何用原生JavaScript模仿这种行为。 1. jQuery的queue()和dequeue()方法 - queue()方法用于显示或操作在匹配元素上执行的...
7. **事件循环与Event Loop**:JavaScript的执行机制由栈和队列组成,事件循环负责从任务队列中取出任务并放入栈中执行。理解事件循环可以帮助解决异步问题和避免回调地狱。 8. **模块系统**:JavaScript原生支持...
Node.js作为一款轻量级、高性能的JavaScript运行环境,非常适合构建微服务。而RabbitMQ作为一种流行的消息队列系统,常被用于微服务间的通信,以实现解耦、异步处理和负载均衡。本项目“Node.js-基于RabbitMQ的Node...
综上所述,"Node.js-Hivemind–使用AWS Lambda functions创建分布式作业Job"这个项目结合了Node.js的高效网络编程能力、AWS Lambda的无服务器计算优势以及分布式作业处理的思想,构建了一个灵活、可扩展的云原生解决...