javascript - 异步方法中的阻塞回调会导致 UI 拖拽吗?
问题描述
我刚刚读了一篇关于异步编程和事件循环的文章。在阅读过程中,他描述了如果我调用一个异步方法并向它传递一个回调,例如一个Ajax
请求,Web API 将处理一个事件。在这种情况下,事件将是Ajax
接收消息的请求。当事件被引发时,它被添加到事件队列中,并且当调用堆栈为空并且正在调用事件队列时,将调用来自事件的回调。
鉴于事件队列的回调被放置在 UI 线程上的调用堆栈上,这是否意味着具有相当长的回调会导致 UI 被阻塞?异步编程不是为了防止这些类型的问题吗?
编辑:我刚刚意识到我可以通过打开浏览器来测试我的理论并通过创建自己来测试它,
setTimeout(function(){
while(true){}
}, 500)
键入此内容时,UI 将冻结。
这是否意味着我是正确的?异步调用和异步代码仍然可以冻结 UI?
解决方案
异步代码最终将在主线程上执行。因此,当异步代码将在主线程上执行时,主线程将冻结。这意味着没有其他代码可以运行。异步代码不会立即开始执行。它会一直等到时间到了,等到异步代码执行的时间到了,它就会以同步的方式执行。
让我来看看你提供的例子。
setTimeout(function(){
while(true){}
}, 500)
您提供给 setTimeout 的回调在 500 毫秒过去之前不会执行。当等待时间结束时,javascript引擎会将回调函数加载到主线程执行。由于它是一个无限循环,主线程将被无限期阻塞。没有其他代码有机会被执行。
推荐阅读
- rest - REST Web 服务上的 HTTP GET 请求是否安全?
- python - 如何使用 sklearn 从 ONE-HOT-ENCODED 标签返回到单列?
- html - 有没有办法在不使用 z-index 的情况下阻止我的图像重叠我的标题/导航栏(这似乎不起作用?)
- html - 如何在绝对定位的父级中水平居中固定内容?
- typescript - 函数参数中解构的 TSLint 错误
- css - 无法从一个菜单项中移除 Webkit-box 阴影
- spring-boot - 没有适合内容类型 application/json;charset=UTF-8 的 HttpMessageConverter
- python - 根据条件从数据框中的现有列创建新列
- sql - 如何从带有分隔符的文本字段中提取第 n 个值
- javascript - 错误:未捕获的类型错误:无法读取 null 的属性“样式”