`
yiminghe
  • 浏览: 1468978 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

setTimeout ,xhr,event 线程问题

阅读更多

由   http://lifesinger.org/blog/?p=1568    所想

 

1. javascript 是单线程的,其实只有 xhr是新开了一个线程而已。

 

第一段代码:

 

setTimeout(function () {
    alert(1);
},
0);
setTimeout(function () {
    alert(2);
},
0);
Ext.ajax.request({
    url: 'xx.不存在',
    failture: function () {
        alert(3);
    }
});

 

alert : 会阻塞当前线程

 

则会先弹出1(不要点确定),等会弹出3,而2只有点击 1,3 都确定后才会弹出

 

第二段代码:

 

setTimeout(function () {
    for (var i = 0; i < 2000; i++)
    console.log('  main thread  ' + i);
},
0);
setTimeout(function () {
    for (var i = 0; i < 1000; i++)
    console.log('  main thread-2  ' + i);
},
0);
Ext.ajax.request({
    url: 'xx.不存在',
    failture: function () {
        alert(3);
        for (var i = 0; i < 100; i++)
        console.log('  sub thread  ' + i);
        alert(4);
    }
});

 

则会 先打印main thread 0,main thread 1,.... 还没到 main thread 1999 时 就 alert(3) ,点确认后 alert(4) , 注意其间 main thread 打印 一直没停, 一直 到 main thread 1999 , 然后 main thread-2 0 main thread-2 1 一直到 main thread-2 999 ,然后 才是 sub thread 0 ....sub thread 99 ,可见只有 ajax 的回调 alert  先弹出了 (与alert 顺序无关),他后面的操作 放在 javascript单线程事件 队列里面

------------------------------------------总结一下

可能不太对, 第二段代码 在 ff 中表现如上,在ie 中 装了 Companion.JS,但是不太准确(打印了3000个log后才弹出alert(3))


故:看见 alert 操作很特殊 可能与事件队列无关,ajax 是新开一个线程 ,返回时,处理函数放在javascript 事件队列的末尾,但里面的 alert 不管顺序挨各先执行.(对应第二段代码)


ajax 回调的alert 可插在 原先的 alert 后面 ,而 原先alert后面的alert 则要等 ajax 回调的alert 点击确定后才能执行。 (对应第一段代码)

 

2.ie element 的事件添加为 先进后出,其他浏览器为 队列 后进后出,不过 setTimeout  都一样的,把定时运行函数放在当前所有操作的最后处理。

 

测试代码:

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>singleThread 测试</title>
<script type="text/javascript" src="ext-base.js"></script>
<script type="text/javascript" src="ext-core.js"></script>
<script type="text/javascript">
//<![CDATA[
var no=0;
Ext.onReady(function() {
	Ext.get('t').on('click',function(){
		setTimeout(function(){
			alert('first click timeout ok');
		},0);
		alert('first click');
		Ext.getDom('debug').innerHTML+=1+'<br />'
	});
	
	Ext.get('t').on('click',function(){
		alert('second click');
		Ext.getDom('debug').innerHTML+=2+'<br />'
	});
	
});
//]]>
</script>
</head>
<body>
<input type='button' id='t' value='click me please' />
<div id='debug'>
</div>
</body>
</html>

 

 

  • 大小: 328.2 KB
分享到:
评论
2 楼 liuweihug 2014-10-14  
Javascript引擎单线程机制及setTimeout执行原理说明 
http://www.suchso.com/projecteactual/Javascript-setTimeout-timer.html
1 楼 lucane 2009-05-07  
第一段代码
先弹出1的概率好小呃。。。
我试了好些次
都是3>1>2的顺序

相关推荐

    关于JS定时器(setTimeout setInterval)定时不准问题1

    setTimeout和setInterval的定时不准问题是由于JavaScript的单线程机制和浏览器的任务队列机制所致。通过动态计算时差的方法,可以减少setInterval的误差累计,但无法消除单个定时器执行延迟问题。

    解决vue 使用setTimeout,离开当前路由setTimeout未销毁的问题

    关于在Vue中管理setTimeout和setInterval,尤其是涉及到Vue的路由切换时定时器未被销毁的问题,主要涉及到Vue的生命周期钩子、JavaScript的this关键字以及ES6箭头函数的特性。 首先,Vue中的生命周期钩子允许我们在...

    js基于setTimeout与setInterval实现多线程

    当涉及到页面加载完成后的执行顺序问题时,可以通过在`window.onload`事件中使用`setTimeout`来安排代码的执行顺序。`window.onload`是当页面所有资源(如图片、样式表等)加载完成后触发的事件。通过在这个事件处理...

    利用setTimeout解决延时执行某操作

    setTimeout,javascript 延时执行函数,闭包处理 利用javascript闭包处理延时操作

    JavaScript中setTimeout的那些事儿

    尽管JavaScript是单线程的,但是通过setTimeout等机制,JavaScript能够实现非阻塞的异步编程模型。以下是对JavaScript中setTimeout相关知识点的详细介绍: 一、setTimeout概述 setTimeout是JavaScript中的一个内置...

    Javascript中, setTimeout() 和 setInterval() 的方法

    在JavaScript编程中,`setTimeout()`和`setInterval()`是两个非常关键的函数,它们用于实现异步编程,特别是在处理动画、定时任务或者延迟执行代码时不可或缺。这两个函数都是全局对象`window`的方法,它们的区别...

    js单线程的本质 Event Loop解析.docx

    ### JavaScript 单线程的本质与 Event Loop 解析 #### 一、JavaScript 单线程机制简介 JavaScript 是一种广泛应用于 Web 开发的语言,其最大的特点之一便是采用了**单线程模型**。这意味着在任何时间点,...

    JavaScript单线程还是多线程

    为了解决这个问题,引入了事件循环(Event Loop)和异步编程模型,如回调函数、Promise和async/await等。 事件循环是JavaScript实现非阻塞I/O的关键机制。当遇到I/O操作时,JavaScript引擎不会等待这些操作完成,...

    模态对话框导致setTimeout失效的解决方案(一)

    然而,当模态对话框打开时,页面的主执行线程被阻塞,使得与用户交互相关的事件无法立即响应,这包括`setTimeout`的回调函数。 问题的根本在于模态对话框创建了一个新的事件循环,这个新的循环会在对话框关闭之前...

    setTimeout应用(模拟站长之家导航)

    2. **延时更新**:如果导航栏包含实时信息,如天气、新闻或股票数据,`setTimeout`可以用来定期更新这些信息,避免过于频繁的请求导致性能问题。 3. **交互响应**:用户与导航栏交互时,例如鼠标悬停在某个链接上,...

    vbs的多线程的解决方法

    然而,在某些情况下,我们可能需要让脚本同时执行多个任务,以提高效率或解决特定问题。本文将详细介绍几种在VBS中模拟多线程的方法,并探讨它们的应用场景和技术细节。 #### 1. 使用WScript.Shell.Run模拟并发执行...

    Javascript定时器 一 单线程

    这种模型避免了多线程可能导致的竞态条件和死锁问题,但同时也带来了挑战,例如阻塞主线程可能导致页面无响应。 ### 二、setTimeout和setInterval 1. **setTimeout**: 这个函数用于在指定的毫秒数后调用一个函数...

    JavaScript多线程的实现方法(gif).txt

    虽然原生JavaScript是基于事件循环的单线程语言,但可以通过一些技巧来模拟多线程的效果,例如利用`setTimeout`或`setInterval`等异步机制。本文将介绍一种通过利用GIF图像加载事件来模拟多线程的方法。 #### GIF ...

    jQuery setTimeout()函数使用方法

    setTimeout()从载入后延迟指定的时间去执行一个表达式或者是函数;仅执行一次 ;和window.clearTimeout一起使用.我在 代码如下:$(document).ready(function(){setTimout(test(),200); function test() { alert&#40;1&#...

    模态对话框导致setTimeout无效的解决方案(二)

    4. 使用Web Workers:如果延迟执行的代码很复杂,可以考虑使用Web Workers在单独的线程中执行,这样就不会受到模态对话框的影响。但请注意,Web Workers不适用于所有类型的JavaScript操作,如DOM操作或访问全局变量...

    setTimeout使用注意事项1

    因为JavaScript引擎是单线程的,必须等待当前任务完成才能处理下一个任务。 3. **定时器最小间隔限制**: 在Chrome浏览器中,连续嵌套调用 `setTimeout` 达到5次以上,如果时间间隔小于4毫秒,浏览器会自动将时间...

    Javascript定时器(二)——setTimeout与setInterval

    JavaScript定时器是编程中不可或缺的一部分,它们允许我们延迟执行代码或定期执行代码。在这个主题中,我们将...它们可以帮助我们实现延迟执行、定时执行和周期性执行等功能,但同时也需要谨慎处理以防止潜在的问题。

    AS3 多线程

    4. 如果处理过程较耗时,可以使用`setTimeout()`或`flash.utils.setTimeout()`方法来模拟异步执行,避免阻塞主线程。 5. 完成处理后,触发自定义的事件,如`bitmapProcessed`,将处理后的位图数据传递给调用者。 ...

    给c#添加SetTimeout和SetInterval函数.docx

    - `System.Timers.Timer` 在多线程环境中可能会存在一定的精度问题,特别是在长时间运行的情况下。这是由系统的调度机制所决定的,并非是实现上的缺陷。 通过上述代码和说明,我们可以在 C# 中轻松地实现类似于 ...

Global site tag (gtag.js) - Google Analytics