`
teclogid
  • 浏览: 31083 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

真正的js异步执行队列

阅读更多
需要用到一个选择模型角度后,等待250ms的渲染,然后拍照的功能。网上找了找,类似sleep的功能,基本上都是死循环,跳出(还有一些加入时间比较啥的,其实一点用都没有,没有出让cpu,比不比时间没有差别),这种代码一执行,基本上浏览器都会告诉你,脚本执行缓慢,是否取消。唯一的办法,就是用setTimeout模拟。没办法,只能自己写了,很简陋,但功能已具备,有需要可以加以扩展。
var ExecQueue = function() {
	this.queue = [];
};
ExecQueue.prototype = {
	add : function(fn, args, time) {
		this.queue.push( {
			fn : fn,
			args : args,
			time : time
		});
	},
	exec : function() {
		var delay = 0;
		for ( var i = 0; i < this.queue.length; i++) {
			var _this=this;
			var f=function(idx){
				return function(){
				_this.queue[idx].fn.apply(_this,_this.queue[idx].args);
				}
			}(i);
			setTimeout(f, delay);
			delay += this.queue[i].time;
		}
	}
}

function a(){
	alert('a');
}
function b(i){
	alert('b'+i);
}
function c(i,j){
	alert('c'+i+j);
}
var execqueue=new ExecQueue();
execqueue.add(a,[],5000);
execqueue.add(b,['i'],5000);
execqueue.add(c,['c1','c2'],5000);
execqueue.add(c,['c3','c4'],2000);
execqueue.exec();
分享到:
评论
4 楼 teclogid 2011-04-15  
dong87 写道
用我的发放解决之后发现doWork()的执行间隔无法控制,不是按设定的1000执行的,好像是按前面的500执行的

这个异步队列是最简单的情形,不支持动态的add,如果执行过程中,需要动态add,需要修改一下add方法
3 楼 dong87 2011-04-06  
用我的发放解决之后发现doWork()的执行间隔无法控制,不是按设定的1000执行的,好像是按前面的500执行的
2 楼 dong87 2011-04-06  
发现是执行新一轮操作的时候没有清空列队导致的
每次执行doWork()时候先清空一下可以解决,但不够优雅,求优雅点的解决方案

function doWork() {
execqueue.queue = []; // <---------加上这句就好了
document.write("<br/><br/>新一轮执行:<br/>");
for (var i=1; i<=3; i++) execqueue.add(writeSth,[i],500);
if (counter++ < 3) execqueue.add(doWork,[],1000);
execqueue.exec();
}
1 楼 dong87 2011-04-06  
您好,当我用如下代码测试的时候,发现程序进入了死循环,不知该如何解决
var execqueue=new ExecQueue(),counter = 0; 
function doWork() {
document.write("<br/><br/>新一轮执行:<br/>");
for (var i=1; i<=3; i++) execqueue.add(writeSth,[i],500);
if (counter++ < 3) execqueue.add(doWork,[],1000);
execqueue.exec();
}
function writeSth(theWord) {
document.write(theWord + "<br/>");
}
doWork();

相关推荐

    前端面试题+异步队列最大执行队列+javascript+异步队列

    求异步队列的最大执行队列,JavaScript中有多个异步请求,每次最多执行n个(10个),实现一个函数,使每次执行都是最大队列 。 { this.tasks = []; this.max = 10; setTimeout(() =&gt; { this.run(); }); }...

    asyncfnqueue一个异步函数队列化执行库

    总之,`async-fn-queue`库为JavaScript开发者提供了一种有效管理异步任务执行的工具,通过队列化执行策略,可以确保任务按顺序执行,同时具备错误处理和性能优化的能力。在处理需要顺序执行或者资源受限的异步任务时...

    JavaScript队列函数和异步执行详解

    读了这篇文章之后,发现还可以用在异步执行等。 假设你有几个函数fn1、fn2和fn3需要按顺序调用,最简单的方式当然是: fn1(); fn2(); fn3(); 但有时候这些函数是运行时一个个添加进来的,调用的时候并不知道都...

    JS异步函数队列功能实例分析

    本文将详细介绍JS异步函数队列的实现方法、应用场景以及相关的操作技巧。 首先,异步函数队列通常使用Promise、async/await或者传统的回调函数来实现。为了更易于理解,本文所举实例采用了较为直观的回调形式来构建...

    JS异步宏队列微队列原理详解

    这个过程就是所谓的事件循环,它是JavaScript异步模型的核心。了解这一机制有助于开发者优化代码执行效率,避免不必要的阻塞,确保程序的响应性。同时,正确使用宏任务和微任务可以更好地控制代码的执行顺序,从而...

    JS异步宏队列与微队列原理区别详解

    这两个概念是理解JavaScript异步执行的核心。 1. **宏任务**: - 宏任务是那些在事件循环中按顺序执行的任务,它们通常在特定的时间点被安排,如定时器(setTimeout、setInterval)、I/O操作、DOM事件等。 - 当一...

    buzy用于node和浏览器的异步队列管理器

    Buzy是一款适用于Node.js和浏览器环境的异步队列管理工具,主要针对JavaScript开发中的并发控制和任务调度问题。在JavaScript编程中,由于其单线程的特性,处理大量并发请求时可能会出现性能瓶颈,而Buzy就是为了...

    javascript实现队列动画

    在上述代码中,`animationQueue`存储了待执行的动画任务,`addAnimationTask`函数用于添加新的动画任务,而`runAnimationQueue`函数则负责按顺序执行队列中的任务。`requestAnimationFrame`用于在浏览器准备好下一次...

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

    Vue.js是一个流行的前端JavaScript框架,它使用数据驱动的方式来操作DOM,以提高应用的响应性和性能。Vue的核心功能之一是其异步更新队列,这一机制保证了在数据发生变化时,Vue能够将这些变化批量处理,然后异步地...

    JS异步加载库

    JavaScript(JS)异步加载库是一种能够帮助开发者在网页中延迟加载或按需加载JavaScript资源的工具。这种库可以显著提高网页性能,减少首屏加载时间,优化用户体验,特别是对于那些依赖大量脚本的复杂应用而言。下面...

    JavaScript 异步方法队列链实现代码分析

    然后,按顺序执行队列中的所有回调函数,将结果`resp`作为参数传递。 在实际应用中,我们可以将异步方法(如`$.ajax`)的回调函数与`Queue`对象结合,确保在异步操作完成后,按照预设的顺序执行链式调用中的后续...

    Node.js-基于kue的egg延时队列

    Kue是Node.js中一个强大的任务队列系统,主要用于处理异步任务,如后台作业、数据处理等。而Egg.js则是一个企业级的Node.js应用框架,它为构建大型、复杂的应用提供了丰富的功能和结构。 首先,我们需要理解什么是...

    异步执行的原理

    异步执行是现代计算机编程中的一个关键概念,特别是在JavaScript等单线程环境中,它的重要性更加凸显。异步执行允许程序在等待I/O操作(如网络请求、文件读写)完成时,不会阻塞主线程的运行,从而提高程序的响应性...

    javascript异步编程 设计快速响应的网络应用 源码

    JavaScript异步编程是Web开发中的核心技能,它使得开发者能够设计出快速响应的网络应用,提供流畅...无论是在前端开发中处理AJAX请求,还是在Node.js后端处理I/O密集型任务,JavaScript异步编程都是不可或缺的一部分。

    uselessjs一个用于控制javascript异步并发后执行顺序的小型库

    useless.js 是一个轻量级的JavaScript库,其主要功能是帮助开发者管理异步操作的并发和执行顺序。在现代Web应用中,由于Ajax、Promise、async/await等技术的广泛应用,异步编程变得越来越常见,同时也带来了挑战,如...

    单线程JavaScript实现异步过程详解

    异步执行的关键在于任务队列。定时器线程在完成计时后,会将回调函数放入任务队列,而不是立即执行。只有当主线程执行完所有同步任务后,才会检查任务队列并开始执行其中的任务。这个过程遵循事件循环(Event Loop)...

Global site tag (gtag.js) - Google Analytics