Javascript 我对异步操作的理解正确吗?

Javascript 我对异步操作的理解正确吗?,javascript,Javascript,我正在努力理解异步的概念。以下关于异步操作的内容大致正确吗 如果一段代码需要很长时间才能完成,则可能会出现问题。这是因为我)它会停止下面的代码运行,在后台加载硬代码的同时运行它可能会更好。ii)实际上,JS可能会在硬代码完成之前尝试执行下面的代码。如果下面的代码依赖于硬代码,那就是一个问题 一个解决方案是:如果一个操作需要很长时间才能完成,那么您希望在处理原始线程的同时在单独的线程中处理它。只需确保主线程不引用异步操作返回的内容。JS为此解决方案使用事件查询。异步操作在主线程之后执行的事件中执

我正在努力理解异步的概念。以下关于异步操作的内容大致正确吗

  • 如果一段代码需要很长时间才能完成,则可能会出现问题。这是因为我)它会停止下面的代码运行,在后台加载硬代码的同时运行它可能会更好。ii)实际上,JS可能会在硬代码完成之前尝试执行下面的代码。如果下面的代码依赖于硬代码,那就是一个问题

  • 一个解决方案是:如果一个操作需要很长时间才能完成,那么您希望在处理原始线程的同时在单独的线程中处理它。只需确保主线程不引用异步操作返回的内容。JS为此解决方案使用事件查询。异步操作在主线程之后执行的事件中执行

  • 但即使是事件que也会遇到与主线程相同的问题。如果位于fetch2之上的fetch1需要很长时间才能返回承诺,而fetch2没有,那么JS可能会在执行fetch1之前开始执行fetch2。这是
    承诺的地方。all
    很有用,因为在解决fetch1和fetch2的承诺之前,它不会继续异步操作的下一步

  • 另一方面,我在链接
    .then
    时读到过,它算作一个异步操作,因此我们可以始终保证后续的
    .then
    仅在
    执行时执行。然后在执行之前
    解决了它的承诺


  • 此页面非常好地解释了Node.js事件循环(因为它是由Node.js创建的):

    如果一段代码需要很长时间才能完成,则可能会出现问题。 这是因为我)它会阻止下面的代码运行,而且可能是 很高兴在后台加载硬代码的同时运行它。(及ii) 实际上,JS可能会在硬代码出现之前尝试执行下面的代码 完成了。如果下面的代码依赖于硬代码,那就是一个问题

    是的,但要改写:让用户等待代码解析是糟糕的用户体验,而不是运行时错误。尽管如此,如果代码块依赖于返回未定义的变量(因为该变量尚未解析),则确实会发生运行时错误

    解决方法是:如果一个操作需要很长时间才能完成,您需要 在单独的线程中处理它,而原始线程 处理。只要确保主线程不引用任何东西 异步操作返回。JS使用事件队列 这个解决方案。异步操作在事件队列中执行 在主线程之后执行

    是的,但需要指出的是,这些其他线程发生在浏览器或api服务器上,而不是JS脚本中。此外,异步函数仍在主调用堆栈中调用,但它们的解析放在作业队列或消息队列中

    但是,即使是que事件也会遇到与 主线程。如果位于fetch2上方的fetch1需要较长时间 是时候返回承诺了,而fetch2没有,JS可能会开始执行 在执行fetch1之前先执行fetch2。这就是承诺。一切都是有用的 因为它不会继续异步过程中的下一步 操作,直到fetch1和fetch2的承诺都得到解决

    是的,只要调用堆栈中的当前函数解析,承诺的解析就会立即执行。如果一个承诺在另一个承诺之前解析,那么它的解析将在第一个事件(如果它被第二个调用)执行。还要注意的是,Promise.all不会更改解析时间,而是按照其承诺的执行顺序一起返回解析

    在另一个注释中,我读过链接时的内容。那么,这也算一个 异步操作,因此我们可以始终保证后续 .then将仅在.then在执行之前|解决 它的承诺

    是的,尽管更新更清晰的语法是async await:

    函数A(){
    返回新承诺((解析,拒绝)=>setTimeout(()=>resolve(“done”),2000))
    }
    异步函数B(){
    试一试{
    console.log(“等待…”);
    常量结果=等待A();
    控制台日志(结果);
    }捕获(e){
    控制台日志(e);
    }
    }
    
    B()几乎正确,但不完全正确

    如果你说的是英语中的“异步”这个词,那么它只是意味着事情可能会无序发生。这个概念在很多语言中都有使用,包括Java和C/C++中的多线程

    如果您讨论的是与node.js或C/C++中的异步I/O相关的异步性的具体概念,那么您确实对其在低级别的工作方式有一些误解

    如果一段代码需要很长时间才能完成,则可能会出现问题。这是因为我)它会停止下面的代码运行,在后台加载硬代码的同时运行它可能会更好。ii)实际上,JS可能会在硬代码完成之前尝试执行下面的代码。如果下面的代码依赖于硬代码,那就是一个问题

    当谈论C/C++中的javascript或异步I/O时(javascript的异步性来源于此),这是不正确的

    实际发生的是,等待某事发生可能需要很长时间才能完成。与其等待,为什么不告诉操作系统在发生这种情况时执行一些代码(回调)

    在操作系统级别,大多数现代操作系统都有API,允许您告诉它在发生某些事情时唤醒您的进程。这可能是键盘事件、鼠标事件、I/O事件(来自磁盘或网络)、系统重新配置事件(例如更改监视器分辨率)等

    大多数传统语言都实现阻塞I/O。当您试图从磁盘或网络读取某些内容时,您的进程立即进入睡眠状态,而O
    Traditional blocking I/O
    
     time
      │
      ├────── your code doing stuff ..
      ├────── read_data_from_disk() ───────────────────┐
      ┆                                                ▼
      :                                        OS puts process to sleep
      .
      .                                         other programs running ..
      .
      :                                            data arrives ..
      ┆                                        OS wakes up your process   
      ├────── read_data_from_disk() ◀──────────────────┘
      ├────── your program resume doing stuff ..
      ▼
    
    Non-blocking I/O (also known as asynchronous I/O)
    
     time
      │
      ├────── your code doing stuff ..
      ├────── read_data_from_disk(read_callback) ───▶ javascript stores
      │                                               your callback and
      ├────── your code doing other stuff ..          remember your request
      │
      ├────── wait_for_mouse_click(click_callback) ─▶ javascript stores
      │                                               your callback and
      ├────── your code doing other stuff ..          remember your request
      │
      ├────── your finish doing stuff.
      ┆       end of script ─────────────▶ javascript now is free to process
      ┆                                  pending requests (this is called
      ┆                                  "entering the event loop").
      ┆                                  Javascript tells the OS about all the
      :                                  events it is interested in and waits..
      .                                            │
      .                                            └───┐
      .                                                ▼
      .                                        OS puts process to sleep
      .
      .                                         other programs running ..
      .
      .                                            data arrives ..
      .                                        OS wakes up your process
      .                                                │
      .                                            ┌───┘
      :                                            ▼
      ┆                       Javascript checks which callback it needs to call
      ┆                          to handle the event. It calls your callback.
      ├────── read_callback() ◀────────────────────┘
      ├────── your program resume executing read_callback
      ▼
    
    fetch(url_1).then(fetch1); // tell js to call fetch1 when this completes
    fetch(url_2).then(fetch2); // tell js to call fetch2 when this completes
    
    fetch(url_1).then(fetch1); // tell js to call fetch1 when this completes
    fetch(url_2).then(fetch2); // tell js to call fetch2 when this completes
    
    while (1) {
        console.log('wait');
    }