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

JavaScript单线程还是多线程

 
阅读更多

 

自工作中有一段经历是在写JavaScript和ActionScript,遇到过前端UI与浏览器插件操作需要多线程的情况。昨天晚上又看到了这样一篇文章:《一个前端工程师眼里的NodeJs》http://www.infoq.com/cn/articles/nodejs-in-front-end-engineer-view

 

在浏览器中JavaScript与UI在同一线程中运行,实际执行中JavaScript确实为UI响应造成了一定影响,比如浏览器插件的调用后无法立即得到结果导致阻塞甚至崩溃的现象最为明显或者是用阻塞方的Ajax。当时也是抱怨JavaScript单线程的不好。

 

实际分析一下,在非同步的Ajax请求之后,直到接收到结果的这段时间里,网络并不会阻塞UI和JavaScript的执行,此时JavaScript和UI操作与网络请求的发送实际上是并行的。那么结果很明显,JavaScript确实在单线程上执行,但是浏览器却是以非单线程的方式执行。Web Worker能够直接解决JavaScript与UI占用个统一线程造成阻塞的问题,它能新开一个线程去执行JavaScript。

 

嵌套问题的解决

JavaScript对单个异步时间的处理十分容易,但是多个异步时间之间协作就很容易出现问题。例如需要需要分别请求三个参数,当三个参数全部返回后执行打印。通常这三个参数的获取都是通过异步来实现的,但是很容易会写成嵌套请求的方式。这样就导致这三个请求是串行执行,降低了性能。

下面是一个例子,start()为串行请求,执行结果是按照顺序打印出来的;paiallel()为并行请求,三个请求的结果打顺序是不确定的,效率更高,三条请求并行发出后等待结果。

 

 

 

<script>
	$(document).ready(function(){
	
		//串行获取结果,保证最后的调用
		function start( ){

			$.ajax({url:"test.xml",
					data:"text",
					error:function(){
					
						alert( "=====1=====");
						var data = 1;
						$.ajax({url:"test.xml",
								data:"text",
								error:function(){
								
									alert( "=====2=====");
									var name = 2;
									$.ajax({url:"test.xml",
											data:"text",
											error:function(){
												
												alert( "=====3=====");
												var pass = 3;
												showInfo( data, name, pass);
											}
									});
								}
						});

					}
			});
		}
		
		//并行获取数据
		function paiallel( ){

			var data = 0;
			var name = 0;
			var pass = 0;
			
			$.ajax({url:"test.xml",
					data:"text",
					error:function(){
						data = 1;
						alert( "=====FIRST=====" + data + "="+ name +"=" + pass);
						
						showInfo_2( data, name, pass);
					}
			});
			
			$.ajax({url:"test.xml",
					data:"text",
					error:function(){
						name = 2;
						alert( "=====SECOND=====" + data + "="+ name +"=" + pass);
						
						showInfo_2( data, name, pass);
					}
			});
			
			$.ajax({url:"test.xml",
					data:"text",
					error:function(){
						pass = 3;
						alert( "=====THIRD=====" + data + "="+ name +"=" + pass);
						
						showInfo_2( data, name, pass);
					}
			});
		}
		
		
		//打印数据
		function showInfo( data, name, pass){
			alert( "data=" + data + "  name=" + name + "   pass=" + pass);
		}
		
		//判断后打印结果
		function showInfo_2( data, name, pass){
			if( data != 0 && name != 0 && pass != 0){
				alert( "data=" + data + "  name=" + name + "   pass=" + pass);
			}
		}
		
		//start();
		
		paiallel();
				   
	});
</script>

 实际开发中,遇到了调用调用浏览器插件阻塞的问题。实际上并不需要插件去开启多线程去处理,保证通信不被阻塞,通过JavaScript,ActionScript都能实现线程的控制。

 

分享到:
评论

相关推荐

    Concurrent.Thread.js javascript多线程

    一个日本人写的javascript多线程类。可以解决很多单线程问题。资源中包括详细的注解

    JavaScript多线程详解

    大家都知道javascript是单线程执行的,但是又可以通过setTimeout或者setInterval定时执行一个方法,通过Ajax可以在向服务器端发送请求没有收到回应可以继续执行主逻辑。这些是如何做到的呢,下面就来探讨下。 先看...

    vb6多线程爬虫源码(单工程active exe多线程)

    active exe 方式的多线程 区别在于只使用了一个工程不需要做多个exe 线程之间数据的传递使用的是事件的方式 而且可以再ide下调试运行 (调试状态使用的是单线程) 使用msgbox 也不会报错 代码也简单. 应该是比较完美的...

    JavaScript是否可实现多线程 深入理解JavaScript定时机制

    容易欺骗别人感情的JavaScript定时器 JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 代码如下: setTimeout( ...

    详细分析单线程JS执行问题

    大家在学习javascript的时候很多朋友在执行问题上有疑惑,小编通过本篇文章给大家详细的分析介绍了JS的执行问题,希望能够帮助到你理解。 一、介绍 随着js不断学习,你可能会慢慢的好奇,用了这么久的js,却不知道这...

    Node.js 多线程完全指南总结

    很多人都想知道单线程的 Node.js 怎么能与多线程后端竞争。考虑到其所谓的单线程特性,许多大公司选择 Node 作为其后端似乎违反直觉。要想知道原因,必须理解其单线程的真正含义。 JavaScript 的设计非常适合在网上...

    concurrent-thread.js:为单线程JavaScript实现多线程并发的功能,语意上参考Java实现,提供getStatesleepjoin等API,并提供线程间通信的功能,依赖ES6语法,基于Promise和Async函数实现,而需要Babel编译才能运行

    为单线程JavaScript实现多线程并发的功能,语意上参考Java实现,提供getState / sleep / join等API,并提供线程间通信的功能,依赖ES6语法,基于Promise和Async函数实现,故需要Babel编译才能运行。JavaScrpt本来...

    mqttws31 mqtt长连JavaScript

    mqttws31mqttws31mqttws31mqttws31mqttws31mqttws31mqttws31mqttws31mqttws31mqttws31mqttws31mqttws31mqttws31mqttws31mqttws31mqttws31mqttws31mqttws31mqttws31mqttws31mqttws31mqttws31mqttws31mqttws31mqttws31...

    multithreaded-downloader-js:用Javascript实现的基于浏览器的多线程下载器

    使用香草JavaScript实现的基于浏览器的多线程下载器。 发送HTTP HEAD请求以获取文件信息并计算块数 为每个块发送带有“ Range:bytes = start-end”标头的HTTP GET请求 监控每个响应流的进度 重试失败或特定的HTTP...

    HTML5之多线程(Web Worker)

    JavaScript 语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。 听起来有些匪夷所思,为什么不设计成多线程提高效率呢?我们可以假设一种场景: 假定 JavaScript 同时有两个线程,一个线程在某个 DOM ...

    javascript中的event loop事件循环详解

    前言 javascript是单线程的语言,也就是说,同一个时间只能做一件事。而这个单线程的特性,与它的用途有关,作为浏览器脚本语言,JavaScript的主要用途是与用户...所以,这个新标准并没有改变JavaScript单线程的本质

    JavaScript可否多线程? 深入理解JavaScript定时机制

    认为setTimeout中的问候方法会立即被执行,因为这并不是凭空而说,而是JavaScript API文档明确定义第二个参数意义为隔多少毫秒后,回调方法就会被执行. 这里设成0毫秒,理所当然就立即被执行了. 同理对setInterval的...

    JavaScript Event Loop相关原理解析

    JavaScript为什么要采用单线程,而不是多线程? 不想让浏览器变得复杂(避免复杂性),因为多线程需要共享资源、且可能修改彼此运行的结果。 该模式会导致的问题? 如果单个任务耗时长,会拖延整个程序的执行,...

    突袭HTML5之Javascript API扩展1—Web Worker异步执行及相关概述

    Javascript执行机制 在HTML5之前,浏览器中JavaScript的运行都是以单线程的方式工作的,虽然有多种方式实现了对多线程的模拟(例如:Javascript 中的 setinterval 方法,setTimeout 方法等),但是在本质上程序的...

    疯狂HTML5\CSS3\JavaScript讲义-源代码

    李刚 疯狂HTML5CSS3JavaScript讲义的源代码 第一部分 ... 第二部分 第6章 级联样式单与CSS选择器 第7章 字体与文本相关... 第17章 使用Worker创建多线程 第18章 客户端通信 第四部分 第19章 HTML 5的疯狂俄罗斯方块

    React的新引擎—ReactFiber是什么?

    浏览器中的渲染引擎是单线程的,几乎所有的操作都是在这个单线程中执行——解析渲染DOMTree和CSSTree,解析执行JavaScript——除了网络操作。这个线程就是浏览器的主线程。单线程意味着,一段时间只做一件事,所以...

    actor-js:探索以Actor模型的样式实现API的潜在好处,即使在单线程编程环境(如Javascript)中也是如此

    探索以Actor模型的样式实现API的潜在好处,即使在单线程编程环境(如Javascript)中也是如此。 去做 演员系统ActorSystem createSystem&#40;&#41; system.actorOf(IActorFactory) -&gt; ActorRef 演员Actor actor....

    实例分析javascript中的异步

    那为什么js要设计成单线程而不是多线程呢?这主要和js的用途有关,js作为浏览器端的脚本语言,主要的用途为用户与服务端的交互与操作dom。而操作dom就注定了js只能是单线程语言。假如js才取多线程将会出现,多个线程...

    nodejs中实现阻塞实例

    澄清一点,node.js的单线程仅仅指javascript引擎是单线程的,无论如何我们没有办法在javascript中实现多线程和阻塞(本文用到的方法同样不是通过V8引擎实现同步的);但对于node.js的其他方面不代表不能多线程,例如...

Global site tag (gtag.js) - Google Analytics