javascript异步编程和单线程之间的一些疑惑

发布于 2022-09-02 12:27:35 字数 1347 浏览 18 评论 0

这两天在研究js异步编程机制,查阅了很多资料,中文的英文的都有。大致上对js异步实现有些了解。但有几点不太理解。

第一个问题:

有一点无论是国内的资料还是英文的,都没有讲到到(可能是过于基础,本人是业余前端,对线程这一块不是很了解)。我们说javascript是单线程,即一次只能执行一个任务,前一个任务结束,后一个才会执行。这是从抽象后的javascript的语言层面说的,还是指各种编译环境内部本来就是单线程?

比如当Thread Pool里注册了各种事件,当有事件触发,就会将callback function 移至Event Queue,这一过程需要不断监听,是需要线程的吧?但此时Event loop本身就在不断监听执行栈和Event Queue,这又是一条线程。可能表述不清,我的意思是事件被触发,并且传递给事件列队和Event Loop不断监听并执行消息列队里的函数并不是同一线程完成的吗?或者事件是编译器底层通过另一个线程来监听,然后再传递给js线程?
clipboard.png

第二个问题:

在阮一峰老师博客(链接描述)中写因为js异步执行,以下两段代码等价

   var req = new XMLHttpRequest();
    req.open('GET', url);    
    req.onload = function (){};    
    req.onerror = function (){};    
    req.send();
   var req = new XMLHttpRequest();
    req.open('GET', url);
    req.send();
    req.onload = function (){};    
    req.onerror = function (){}; 

但另一位专业js老师(链接描述)指出有错误【这个调用其实有个默认回调函数,Ajax结束后,执行回调函数,回调函数检查状态,决定调用onload还是onerror。所以只要在回调函数执行之前设置这两个属性就行】具体批注不太懂,请问是如何理解的呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

弥枳 2022-09-09 12:27:35

csdn 那家伙说的是对的,但哔哔了半天没有说清楚。

有一种情况会使其不等价: 如果ajax的响应很快,快到 send 还没返回或刚返回但还没往下走时,数据到了回调却还没设置,数据就会被ignore。你可以通过延时 3 秒再设置回调来观察这个现象。

但实际中,ajax 是几乎不可能比回调设置快的。因此这两段近似等价。

-小熊_ 2022-09-09 12:27:35

第一个问题已经解决,js是单线程是指执行层面不能同时执行多条语句。但是js宿主如浏览器并不是单线程的,异步请求是交给浏览器其他线程来完成,添加到事件列队,js执行完栈中的代码,就会再去不断执行事件列队里的函数。
第二个还在找答案中

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文