javascript - javascript回调函数执行哪个线程?
问题描述
最近我读了一些关于 javascript 的 aync I/O,但我对 javascript 在哪里执行它的 aync 回调感到更加困惑?主线程还是其他?节点和浏览器有什么区别吗?
解决方案
当响应返回时,在主线程上执行异步调用处理程序。
如果您从 webworker 执行它,异步调用处理程序将在 webworker 线程中处理。
它从上到下大致遵循此设置。
parent thread
|
async start
|
- - - - - - > IO thread
| |
other stuff make call
| |
more stuff get response
| |
| <--queue handling
V
handle async
response
从技术上讲,node 处理 io 线程的方式与浏览器处理方式之间存在差异,但出于所有意图和目的,您将体验到相同的结果。
看下面的例子,看看异步任务如何被推到另一个线程的“现场演示”,主线程继续做它的事情。然后响应来了,被排入主线程,然后当处理程序完成时主线程继续做它的事情。
var request = new XMLHttpRequest();
request.open('GET', 'https://api.jikan.moe/meta/requests/anime/today');
request.onreadystatechange = function () {
if (this.readyState === 4) {
console.log('Status:', this.status);
console.log('Headers:', this.getAllResponseHeaders());
console.log('Body:', this.responseText);
}
};
var start = 0;
request.send();
for(var c=0;c<1000;c++) {
+function(c) {
start += 1;
window.setTimeout(function() {
console.log(start, c);
},c);
}(c)
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Hit f12 and scroll through the log output
推荐阅读
- reactjs - node_modules 中的 babel 箭头函数错误
- flutter - 使用标签在颤动中导航屏幕
- java - Java 中的 I/O 与类文件
- python - Anaconda 4.7.5 - 关于 conda-build <3.18.3 和 python 包问题的警告
- c++ - 我们如何使用 stl 容器有效地存储对象?(即根据字段值进行搜索)
- reactjs - MUI:如何在小断点中删除网格项目上的间距?
- r - 如何使用 coord_polar
- php - 如何在我的函数中包含多个 preg_replace 命令?
- macos - 是否可以为 High Sierra/Mojave 编译 ImageMagick 的静态/便携版本?
- c# - 从一个控制器调用动作方法到另一个