Vil*_*oja 7 javascript asynchronous
我听说有人在谈论javascript中的异步操作.另一方面,人们说Javascript总是同步同步javascript.这是真的吗?Javascript真的是异步还是同步?当人们谈论异步javascript时,人们的意思是什么?
我所理解的是,同一页面上的Javascript无法与另一个javascript代码块同时运行.但是例如在ajax请求中,在等待服务器响应时,可以执行代码,然后当响应到达时,继续回调.虽然这是否意味着,在我们等待服务器响应时运行的代码将不得不完成自己,否则它将被中断?
Frx*_*rem 14
Javascript可以异步运行代码(即"在后台"),但不能同时运行(即"同时").差别在于,异步JavaScript代码只会在没有其他代码运行时运行.
考虑这个例子:
// print message asynchronously
setTimeout(function() {
console.log('message');
}, 1000);
// infinite loop
while(true) { } // WARNING: if you actually try to run this, it will
// likely crash your browser...
Run Code Online (Sandbox Code Playgroud)
如果JavaScript具有真正的并发性,我们预计message会在1000毫秒后打印出来.但是,由于JavaScript只是异步,它必须等到没有其他代码在运行; 因为它停留在无限循环中,所以它永远无法在setTimeout函数内部运行代码.
您可能会将同步性与并发性混淆.JavaScript没有并发性,或者同时运行两个执行线程; 你必须使用Web Workers之类的东西生成一个全新的JavaScript解释器,或者在Node的情况下运行一组worker来获得并发.
然而,它确实具有异步性; 您为异步发生的事件注册回调,并且事件循环按它们发生的顺序调用这些回调.事件回调仍然是非并发的,但这不会使JavaScript非异步.
请注意,并发和异步代码之间存在差异.当人们说JavaScript不是"真正的异步"时,他们意味着没有两行JavaScript代码可以同时运行,因为它是明确的单线程.
但是,它是一种异步语言,某些函数将在后台执行和处理,然后在数据就绪时触发回调函数或事件监听器.在这种情况发生的同时,其他JavaScript块可以运行,但同样,不是在运行任何其他JavaScript行时.