自工作中有一段经历是在写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都能实现线程的控制。
分享到:
相关推荐
本文将深入探讨JavaScript的单线程和多线程概念,解释它们如何影响程序的执行,以及如何在实际开发中利用这些特性。 JavaScript的单线程和多线程模型各有优势和挑战。开发者需要根据应用的具体需求,合理选择并发...
JavaScript,作为一种广泛应用于Web开发的脚本语言,一直以来都是单线程执行的。然而,在处理复杂的计算任务或者大型数据操作时,单线程的模式可能会导致浏览器变得卡顿,用户体验下降。为了解决这个问题,开发者们...
虽然原生JavaScript是基于事件循环的单线程语言,但可以通过一些技巧来模拟多线程的效果,例如利用`setTimeout`或`setInterval`等异步机制。本文将介绍一种通过利用GIF图像加载事件来模拟多线程的方法。 #### GIF ...
本篇文章将深入探讨JavaScript定时器的工作原理以及它们在单线程环境中的行为。 ### 一、JavaScript的单线程模型 JavaScript是一种解释型的、基于原型的、动态类型的脚本语言,它的执行环境主要是Web浏览器中的...
JavaScript,作为一种广泛应用于Web开发的脚本语言,一直以来都是单线程执行的,这限制了其在处理大量计算任务或长时间运行操作时的性能。然而,随着技术的发展,JavaScript已经引入了多线程功能,以应对现代Web应用...
JavaScript是一种单线程编程语言,这意味着它在任何给定时间只能执行一个任务。这通常是通过事件循环和回调函数来实现的,但这限制了其并行处理能力,特别是在处理大量计算或长时间运行的任务时,可能会导致浏览器...
JavaScript是一种单线程编程语言,这意味着它在任何时刻只能执行一个任务。这一设计背后的考虑是为了保持DOM操作的稳定性。在多线程环境中,对同一元素的并发操作可能导致数据不一致和不可预测的结果,例如上面提到...
JavaScript,作为Web开发的核心语言,一直以来都是单线程执行的,这意味着在任何时刻只能执行一个任务。然而,随着Web应用程序复杂性的增加,开发者对于多线程的需求也日益增强。为了解决这一问题,JavaScript引入了...
总结来说,JavaScript的单线程执行模型并不会限制其处理复杂任务的能力,反而通过异步编程和事件驱动的机制,JavaScript能够在浏览器的多线程环境下高效地处理并发操作。了解这些概念对于构建高性能的Web应用至关...
JavaScript,作为一种广泛应用于Web开发的脚本语言,一直以来都是单线程执行的。然而,随着Web应用程序变得越来越复杂,处理大量的计算任务或者长时间运行的异步操作时,单线程模型可能会导致用户界面冻结,影响用户...
在这个主题中,我们将深入探讨JavaScript中的定时器机制,特别是与单线程环境相关的方面。 首先,JavaScript是一种解释型、基于原型的、弱类型的脚本语言,其在浏览器环境中运行时,遵循一种称为“事件循环”...
浏览器的内核虽然是多线程的,包括但不限于JavaScript引擎线程、GUI渲染线程和浏览器事件触发线程等,但这些线程需要在JavaScript引擎的控制下相互配合,以保证操作的同步性。例如,当JavaScript引擎正在执行代码时...
总的来说,`Concurrent.Thread.js` 是一个实用的JavaScript多线程库,它通过提供简单易用的API,使开发者能够更容易地利用Web Worker技术,解决单线程JavaScript的性能瓶颈。通过深入理解和熟练使用这个库,你可以...
在传统的JavaScript开发中,由于其单线程特性,处理复杂的异步操作时容易导致界面阻塞或者响应延迟等问题。为了解决这一问题,并提高Web应用的性能和用户体验,开发者们不断探索新的方法和技术。本文将详细介绍如何...
### 线程之舞:JavaScript的单线程与非阻塞I/O揭秘 #### JavaScript简介及主要特点 JavaScript(通常简称为JS)是一种高级、解释型的编程语言,广泛应用于构建交互式的Web应用程序。随着时间的推移,JavaScript已...
由于多线程操作DOM可能导致复杂的同步问题,JavaScript被设计为单线程,以简化编程逻辑。然而,为了充分利用多核处理器的能力,HTML5引入了Web Worker,但这并未改变JavaScript的单线程本质,因为Web Worker仍然受限...
在探讨JavaScript是否可以实现多线程之前,我们首先要明确一个概念,即JavaScript通常是单线程的,它遵循“一切操作都在单线程中进行”的原则。这与多线程编程语言不同,多线程语言允许多个线程同时执行多个任务,而...
本项目提供了一个单线程的进度条程序,适用于那些需要显示执行过程的软件工程。这个程序的核心是通过定时器来控制进度条的更新,以实现动态显示的效果。 首先,我们要理解单线程的概念。在计算机编程中,一个线程是...