哪个线程是javascript回调函数执行?

时间:2018-05-31 14:10:42

标签: javascript

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

1 个答案:

答案 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