JavaScript:异步函数会创建一个新线程吗



Mozilla关于XMLHttpRequest的文档包括以下关于async参数的内容:

注意:主线程上的同步请求很容易破坏用户体验,应该避免;事实上,许多浏览器完全不赞成在主线程上支持同步XHR。

这是有道理的,因为你不知道该让主线程等待一段不确定的时间。

如果我创建一个包含usngXMLHttpRequestasync函数,它是否符合新线程的条件?

我知道fetch(),我知道promise,我知道将XMLHttpRequest与回调一起使用。这个问题是关于async关键字的。

JavaScript(在浏览器中(完全是单线程的(WebWorkers除外(。术语"异步"并不一定与多线程有关。

网络获取可能发生在性能更高的语言(c++、rust等(中的浏览器"网络"线程上,但这对JavaScript来说毫无意义。

同步在JavaScript中的意思是,处理实际网络请求的c++代码将暂停JavaScript事件循环,直到请求完成。这意味着在请求完成之前,JavaScript上下文中绝对不会发生任何事情。

因此,async意味着当网络获取在后台进行时,您可以在单个JavaScript线程上做其他事情。这是通过c++调用JavaScript回调或解析JavaScript Promise(又名async/await(来实现的。

我将尝试在伪代码中更清楚地阐述:

const response = makeRequest({ asyncMode: false });
//nothing can happen until this request finishes
//requestAnimationFrame animation code or click event listeners will not run
// until the request is finished
makeRequest({ asyncMode: true, callback: function(response, error){ console.log("this will execute later once the network request is made") } });
console.log("this code will run right away");
//requestAnimationFrame animation code or click event listeners will run as normal
//  during the request

相关内容

最新更新