Man*_*ngo 10 javascript multithreading asynchronous function
Mozilla\xe2\x80\x99s 文档XMLHttpRequest包含有关该参数的以下内容async:
\n\n\n注意:主线程上的同步请求很容易破坏用户体验,应该避免;事实上,许多浏览器已经完全弃用了主线程上的同步 XHR 支持。
\n
这是有道理的,因为您不知道如何阻止主线程等待不确定的时间。
\n\n如果我创建一个async包含 usng 的函数XMLHttpRequest,它是否符合新线程的资格?
我知道fetch(),我知道承诺,我知道如何XMLHttpRequest与回调一起使用。这个问题是关于async关键字的。
JavaScript(在浏览器中)完全是单线程的(WebWorkers 除外)。术语“异步”不一定与多线程有任何关系。
网络获取可能发生在高性能语言(c++、rust 等)的浏览器“网络”线程上,但这对 JavaScript 来说没有任何意义。
JavaScript 术语中的同步意味着处理实际网络请求的 C++ 代码将暂停 JavaScript 事件循环,直到请求完成。这意味着在请求完成之前,JavaScript 上下文中绝对不会发生任何事情。
因此,异步意味着您可以在单个 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)