首页 > 解决方案 > javascript回调函数执行哪个线程?

问题描述

最近我读了一些关于 javascript 的 aync I/O,但我对 javascript 在哪里执行它的 aync 回调感到更加困惑?主线程还是其他?节点和浏览器有什么区别吗?

标签: javascript

解决方案


当响应返回时,在主线程上执行异步调用处理程序。

如果您从 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


推荐阅读