1.Javascript语言的执行环境是”单线程”(single thread):
优点:实现起来比较简单,执行环境相对单纯;
缺点:只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方,其他任务无法执行。
为了解决这个问题,Javascript语言将任务的执行模式分成两种:同步(Synchronous)和异步(Asynchronous)。
2.”异步模式”编程的几种方法:
(1)回调函数:优点是简单、容易理解和部署,缺点是不利于代码的阅读和维护,各个部分之间高度耦合(Coupling),使得程序结构混乱、流程难以追踪(尤其是回调函数嵌套的情况),而且每个任务只能指定一个回调函数。
(2)采用事件驱动模式(事件监听):优点是比较容易理解,可以绑定多个事件,每个事件可以指定多个回调函数,而且可以”去耦合“(Decoupling),有利于实现模块化。缺点是整个程序都要变成事件驱动型,运行流程会变得很不清晰。
(3)观察者模式(发布\订阅模式):这种方法的性质与”事件监听”类似,但是明显优于后者。因为我们可以通过查看”消息中心”,了解存在多少信号、每个信号有多少订阅者,从而监控程序的运行。
3.异步操作的流程控制。
(1)串行执行:编写一个流程控制函数,让它来控制异步任务,一个任务完成以后,再执行另一个。
var items = [ 1, 2, 3, 4, 5, 6 ]; var results = []; function series(item) { if(item) { async( item, function(result) { results.push(result); return series(items.shift()); }); } else { return final(results); } } series(items.shift());
函数series就是串行函数,它会依次执行异步任务,所有任务都完成后,才会执行final函数。items数组保存每一个异步任务的参数,results数组保存每一个异步任务的运行结果。
(2)并行执行:所有异步任务同时执行,等到全部完成以后,才执行final函数。
//forEach方法会同时发起6个异步任务,等到它们全部完成以后,才会执行final函数。 var items = [ 1, 2, 3, 4, 5, 6 ]; var results = []; items.forEach(function(item) { async(item, function(result){ results.push(result); if(results.length == items.length) { final(results); } }) });
并行执行的好处是效率较高,比起串行执行一次只能执行一个任务,较为节约时间。但是问题在于如果并行的任务较多,很容易耗尽系统资源,拖慢运行速度。因此有了第三种流程控制方式。
(3)并行与串行的结合:设置一个门槛,每次最多只能并行执行n个异步任务。这样就避免了过分占用系统资源。
//变量running记录当前正在运行的任务数,只要低于门槛值,就再启动一个新的任务 //如果等于0,就表示所有任务都执行完了,这时就执行final函数 //最多只能同时运行两个异步任务。 var items = [ 1, 2, 3, 4, 5, 6 ]; var results = []; var running = 0; var limit = 2; function launcher() { html" target="_blank">while(running < limit && items.length > 0) { var item = items.shift(); async(item, function(result) { results.push(result); running++; if(items.length > 0) { launcher(); } }); running--; if(running == 0) { final(); } } }
以上就是小编为大家带来的浅谈js的异步执行全部内容了,希望大家多多支持小牛知识库~
本文向大家介绍浅谈node.js中async异步编程,包括了浅谈node.js中async异步编程的使用技巧和注意事项,需要的朋友参考一下 1.什么是异步编程? 异步编程是指由于异步I/O等因素,无法同步获得执行结果时, 在回调函数中进行下一步操作的代码编写风格,常见的如setTimeout函数、ajax请求等等。 示例: 这里大部分人会认为输出123,或者333。其实它会输出 444 这里就是我
本文向大家介绍浅谈原生JS中的延迟脚本和异步脚本,包括了浅谈原生JS中的延迟脚本和异步脚本的使用技巧和注意事项,需要的朋友参考一下 一、延迟脚本 defer HTML4.0中为<script> 标签添加了个defer属性。属性的用途是表民脚本在执行时不会影响页面的构造。 脚本会被延迟到页面加载完毕的时候,执行。也就是当浏览器解析到</html> 标签后才会执行代码。在HTML5规范中,defer属
本文向大家介绍浅谈js的setInterval事件,包括了浅谈js的setInterval事件的使用技巧和注意事项,需要的朋友参考一下 setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。 setinterval()用法 setInterval
本文向大家介绍浅谈struts1 & jquery form 文件异步上传,包括了浅谈struts1 & jquery form 文件异步上传的使用技巧和注意事项,需要的朋友参考一下 1.概述 还在用struts1?是的,在地球的没写地方,落后的生产方式还在运转(老项目). 从 继承org.apache.struts.action.Action, 继承org.apache.struts.actio
本文向大家介绍浅谈JS之tagNaem和nodeName,包括了浅谈JS之tagNaem和nodeName的使用技巧和注意事项,需要的朋友参考一下 nodeName是节点的属性,tagName是元素的属性。元素是节点的子集。不是任何节点都有tagName的,比如文本节点,仅有nodeName属性。 这个和css中的倾斜和斜体的关系是一样的。不是所有元素都有斜体的,但是都能倾斜。 以上这篇浅谈JS之
本文向大家介绍浅谈JS的原型和继承,包括了浅谈JS的原型和继承的使用技巧和注意事项,需要的朋友参考一下 参考文献 JavaScript原型与继承的秘密 __proto__ 除null和undefined,JS中的所有数据类型都有这个属性; 它表示当我们访问一个对象的某个属性时,如果该对象自身不存在该属性, 就从它的__proto__属性上继续查找,以此类推,直到找到,若找到最后还是没有找到,则结果