Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在异步方法中使用阻塞回调是否会导致UI停止?_Javascript_Asynchronous - Fatal编程技术网

Javascript 在异步方法中使用阻塞回调是否会导致UI停止?

Javascript 在异步方法中使用阻塞回调是否会导致UI停止?,javascript,asynchronous,Javascript,Asynchronous,我刚刚读了一篇关于异步编程和事件循环的文章。在阅读过程中,他描述了如果我调用异步方法并向其传递回调,例如Ajax请求,那么web API将处理一个事件。本例中的事件是接收消息的Ajax请求。当引发事件时,会将其添加到事件队列中;当调用堆栈为空且正在调用事件队列时,会调用来自事件的回调 假设事件队列的回调被放置在UI线程上的调用堆栈上,这难道不意味着具有相当长的回调将导致UI被阻塞吗?异步编程不是为了防止这些类型的问题吗 编辑:我刚刚意识到我可以通过打开浏览器并通过创建 setTimeout(fu

我刚刚读了一篇关于异步编程和事件循环的文章。在阅读过程中,他描述了如果我调用异步方法并向其传递回调,例如
Ajax
请求,那么web API将处理一个事件。本例中的事件是接收消息的
Ajax
请求。当引发事件时,会将其添加到事件队列中;当调用堆栈为空且正在调用事件队列时,会调用来自事件的回调

假设事件队列的回调被放置在UI线程上的调用堆栈上,这难道不意味着具有相当长的回调将导致UI被阻塞吗?异步编程不是为了防止这些类型的问题吗

编辑:我刚刚意识到我可以通过打开浏览器并通过创建

setTimeout(function(){
   while(true){}
}, 500)
键入此项时,UI将冻结


这是否意味着我是正确的?异步调用和异步代码仍然可以冻结UI?

是的,您的直觉是正确的

因为javascript是单线程的,所以在事件循环中所做的任何工作都会阻塞UI

Ajax
这样的异步调用的优点是,脚本在等待网络响应时实际上不需要做任何工作。最好在等待时放弃控制,释放UI,直到Ajax调用返回,然后您就可以做一些事情了


例如,您可以在同步模式下发送Ajax请求,它将在等待时阻塞。异步代码最终将在主线程上执行。因此,当异步代码在主线程上执行时,主线程将冻结。这意味着没有其他代码可以运行。异步代码不会立即开始执行。它将一直等到时机成熟,当异步代码执行的时机成熟时,它将以同步方式执行

让我来谈谈你提供的例子

setTimeout(function(){
   while(true){}
}, 500)

在500毫秒过去之前,您提供给setTimeout的回调将不会执行。等待时间结束后,javascript引擎会将回调函数加载到主线程执行。由于它是一个无限循环,主线程将被阻塞无限长的时间。没有其他代码有机会执行

异步调用并不意味着中存在的任何执行都与主线程完全断开。这只意味着,事件的顺序发生了变化,但最终一切都在同一个UI线程中结束。是的,如果回调函数执行类似于您给出的示例的操作,则UI将被冻结。@KrishnaPrashatt谢谢,我想了一会儿线程,线程如何在彼此之间切换而不阻塞UI。所以当谈到异步时,我正在研究它,因为它是单线程的。@user12388651同步或异步的,javascript中的每一段代码最终都将在主线程上运行。检查我提供的详细答案,以获得更多澄清。