主要意思就是说javascript引擎是单线程执行的,while循环那里执行的时候,settimeout里面的函数根本没有执行的机会,这样while那里永远为真,造成死循环。但是单纯看还是不怎么踏实,最后发挥实践精神,自己动手做了两个实验:
1、简单的settimeout
setTimeout(function
() { while
(true
) { } }, 1000);
setTimeout(function
() { alert('end 2'
); }, 2000);
setTimeout(function
() { alert('end 1'
); }, 100);
alert('end'
);
执行的结果是弹出‘end’‘end 1’,然后浏览器假死,就是不弹出‘end
2’。也就是说第一个settimeout里执行的时候是一个死循环,这个直接导致了理论上比它晚一秒执行的第二个settimeout里的函数被阻塞,
这个和我们平时所理解的异步函数多线程互不干扰是不符的。使用mule生成WSDL中文乱码问题解决方法
2、ajax请求回调
接着我们来测试一下通过xmlhttprequest实现ajax异步请求调用,主要代码如下:
var
xmlReq = createXMLHTTP();//创建一个xmlhttprequest对象
function
testAsynRequest() {
var
url = "/AsyncHandler.ashx?action=ajax"
;
xmlReq.open("post"
, url, true
);
xmlReq.setRequestHeader("Content-Type"
, "application/x-www-form-urlencoded"
);
xmlReq.onreadystatechange = function
() {
if
(xmlReq.readyState == 4) {
if
(xmlReq.status == 200) {
var
jsonData = eval('('
+ xmlReq.responseText + ')'
);
alert(jsonData.message);
}
else
if
(xmlReq.status == 404) {
alert("Requested URL is not found."
);
} else
if
(xmlReq.status == 403) {
alert("Access denied."
);
} else
{
alert("status is "
+ xmlReq.status);
}
}
};
xmlReq.send(null
);
}
testAsynRequest();//1秒后调用回调函数
while
(true
) {
}
在服务端实现简单的输出:TP-LINK WR340G设置教程
private
void
ProcessAjaxRequest(HttpContext context)
{
string
action = context.Request["ajax"
];
Thread.Sleep(1000);//等1秒
string
jsonObject = "{\"message\":\""
+ action + "\"}"
;
context.Response.Write(jsonObject);
}
理论上,如果ajax异步请求,它的异步回调函数是在单独一个线程中,那么回调函数必然不被其他线程”阻挠“而顺利执行,也就是1秒后,它回调执行弹出‘ajax’,可是实际情况并非如此,回调函数无法执行,因为浏览器再次因为死循环假死。
结论:根据实践结果,可以得出,javascript引擎确实是单线程
处
理它的任务队列(能理解成就是普通函数和回调函数构成的队列吗?)的。在javascript里实现异步编程很大程度上就是一种障眼法,单线程的引擎实现
多线程的编程,如果要实现一些资源同步互斥之类的操作(一如C#、Java等语言的多线程),我感觉真正实现起来根本无法轻易得到保证。
补充:如何实现javascript的sleep呢?在stackoverflow上找到一篇javascript sleep,试了一下,效果是有了,但是执行的时候cpu很高,真还不如直接settimeout呢。
分享到:
相关推荐
Javascript的setTimeOut和setInterval函数应用非常广泛,它们都用来处理延时和定时任务,比如打开网页一段时间后弹出一个登录框,页面每隔一段时间发送异步请求获取最新数据等等。但它们的应用是有区别的。 ...
求异步队列的最大执行队列,JavaScript中有多个异步请求,每次最多执行n个(10个),实现一个函数,使每次执行都是最大队列 。 { this.tasks = []; this.max = 10; setTimeout(() => { this.run(); }); }...
用于setTimeout AWAITRESS的简单JavaScript异步库一个用于异步处理浏览器超时的小库node.js安装npm install或yarn install Wait这是将setTimeout转换为异步用法的导入{wait} from'awaitress'异步函数...
主要介绍了JavaScript中从setTimeout与setInterval到AJAX异步,非常不错,具有参考借鉴价值,需要的朋友可以参考下
计时器的执行常常和我们的直观想象不同,那是因为JavaScript引擎是单线程的。我们先来认识一下下面三个函数是如何控制计时器的。 var id = setTimeout(fn, delay); – 初始化一个计时器,然后在指定的时间间隔后执行...
NULL 博文链接:https://chenxiuheng.iteye.com/blog/2227619
今天研究一个小问题: 怎么拿到JavaScript异步函数的返回值? 1.错误尝试 当年未入行时,我的最初尝试: [removed] function getSomething() { var r = 0; setTimeout(function() { r = 2; }, 10); return r; ...
JavaScript最基础的异步函数是setTimeout和setInterval。setTimeout会在一定时间后执行给定的函数。它接受一个回调函数作为第一参数和一个毫秒时间作为第二参数。以下是用法举例: console.log( "a" ); ...
异步编程 众所周知 JavaScript 是单线程工作,也就是只有一个...异步编程传统的解决方案:回调函数和事件监听 初始示例:假设有两个函数, f1 和 f2,f1 是一个需要一定时间的函数。 function f1() { setTimeout(f
但是,不知道大家有疑问没——就是我们在编程过程中的setTimeout(类似的还有setInterval、Ajax),不是异步执行的吗?!! 例如: <!DOCTYPE html> <head> <title>setTimeout</title> ...
问题 可修改下面的 aa() 函数,目的是在一抄后用 console.log() 输出 want-value ...问题的主要目的是考察对异步调用执行结果的处理,既然是异步调用,那么 不可能同步等待异步结果,结果一定是异步的 setTimeout
Javascript里异步编程逐渐被大家接受,先前大家一般通过回调嵌套,setTimeout、setInterval等方式实现,代码看起来非常不直观,不看整个代码逻辑很难快速理解。Javascript里异步函数大概有I/O函数(Ajax、post...
一直以来都知道JavaScript是一门单线程语言,在笔试过程中不断的遇到一些输出结果的问题,考量的是对异步编程掌握情况。一般被问到异步的时候脑子里第一...在JavaScript引擎中负责解析和执行JavaScript代码的线程只有一
所以,在JavaScript中,提供了一些异步特性,为程序提供了性能和体验上的益处,比如可以将代码放到setTimeout()中执行;或者在网页中,我们使用Ajax的方式向服务器端做异步数据请求。这些异步的代码不会阻塞当前的...
所以其实setTimeout和setInterval所谓的“异步调用”事实上是通过将代码段插入到代码的执行队列中实现的。 而如何计算插入的时间点呢?自然是要用到我们所说的timer,也就是计时器。当执行setTi
为什么需要异步?why?来看一段代码。 问题1: for(var i=0;i<100000;i++){ } alert('hello world!!!'); 这段代码的意思是执行100…次后再执行alert,这样带来的问题是,严重堵塞了后面代码的执行,...
前端有AJAX,setTimeout等,后端Node异步更多。按照传统的做法,那么就是各种回调嵌回调。代码可以把人绕晕。 这个时候,CommonJS社区提出了一个叫做Promise/A+的规范,这个规范定义了如何书写异步代码,包括使用...
耗时操作或nodejs没有提供异步模式的api(例如解密、同步的文件api)都可以在线程池中执行,业务代码只需要返回一个Promise或async函数给线程池库,至于业务逻辑做什么操作,其实都可以,比如setTimeout,异步操作,...