rfly_fly 2016-04-03 03:48 采纳率: 100%
浏览 1392

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

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

第一个问题:

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

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

第二个问题:

在阮一峰老师博客(链接描述)中写因为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。所以只要在回调函数执行之前设置这两个属性就行】具体批注不太懂,请问是如何理解的呢?

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-05 08:35
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    JavaScript中的异步编程通常指的是使用Promise、async/await或回调函数等技术使代码可以在后台运行而不会阻塞主线程。这些方法允许你处理异步操作(例如网络请求、数据库查询等),并在完成时通知主程序。

    1. 线程与线程池:在现代浏览器环境中,JavaScript引擎本身就是一个多线程系统,它会为每个脚本实例创建一个单独的线程。然而,在某些情况下,例如处理大量数据或并发请求时,可能会启用线程池来提高性能。线程池中的每个线程都负责处理特定的任务,而不是同时处理多个任务。因此,尽管JavaScript引擎本身是一个多线程系统,但在实际应用中,线程池可以用来管理线程资源,避免不必要的线程竞争。

    2. 异步代码之间的通信:异步代码通常在不同的作用域下执行,这意味着它们不需要在同一时刻执行。例如,你可以在一个函数中异步地发送一个HTTP请求,然后在另一个函数中接收响应。在这种情况下,两个函数并不在同一线程或进程中执行,而是分别在各自的作用域内执行。

    3. 回调函数与事件循环:在一些情况下,回调函数确实会在同一时刻处理多个事件。例如,一个事件处理器(例如一个按钮点击事件)可以捕获用户输入,然后立即返回一个结果,这可能导致多个回调函数同时处理同一个事件。然而,大多数现代浏览器已经实现了事件循环,使得不同类型的事件(如页面加载、DOM操作、键盘/鼠标事件等)会被处理在不同的线程或进程中,从而避免了线程间的竞态条件。

    4. 异步代码与回调函数的区别:虽然异步代码和回调函数都可以用于处理非同步的操作,但它们有不同的用途。回调函数主要用于处理异步操作的结果,而异步代码则更侧重于异步操作本身。例如,异步代码可以包含复杂的逻辑,如处理多个请求、处理异步数据流等,而回调函数则更适合处理简单的异步事件,如单个请求成功或失败的情况。

    5. 异步代码的优化:为了提高效率,许多现代浏览器已经在JavaScript引擎中添加了一些功能,以减少异步代码中的回调函数数量和降低其复杂性。例如,Promise API提供了链式调用的方法,可以简化异步操作的编写;async/await语法提供了一种更加简洁的方式来处理异步操作。

    总的来说,JavaScript的异步编程主要涉及如何处理非同步的操作,以及如何在异步代码之间进行协调。在实践中,开发者可以根据具体的业务需求选择合适的工具和技术来实现异步编程。

    评论

报告相同问题?

悬赏问题

  • ¥15 给我一个openharmony跑通webrtc实现视频会议的简单demo项目,sdk为12
  • ¥15 vb6.0使用jmail接收smtp邮件并另存附件到D盘
  • ¥30 vb net 使用 sendMessage 如何输入鼠标坐标
  • ¥15 关于freesurfer使用freeview可视化的问题
  • ¥100 谁能在荣耀自带系统MagicOS版本下,隐藏手机桌面图标?
  • ¥15 求SC-LIWC词典!
  • ¥20 有关esp8266连接阿里云
  • ¥15 C# 调用Bartender打印机打印
  • ¥15 我这个代码哪里有问题 acm 平台上显示错误 90%,我自己运行好像没什么问题
  • ¥50 C#编程中使用printDocument类实现文字排版打印问题