最近我读了一些关于javascript的aync I / O但是我觉得javascript在哪里执行它的aync的回调更加困惑?主线还是其他?节点和浏览器有什么不同吗?
答案 0 :(得分:6)
当响应返回时,在主线程上执行异步调用处理程序。
如果从webworker执行它,异步调用处理程序将在webworker线程中处理。
从上到下大致遵循此设置。
parent thread
|
async start
|
- - - - - - > IO thread
| |
other stuff make call
| |
more stuff get response
| |
| <--queue handling
V
handle async
response
从技术上讲,节点如何处理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