【问题标题】:Asynchronous code execution异步代码执行
【发布时间】:2017-09-25 02:31:07
【问题描述】:

我在玩这个异步代码,虽然预计回调将在 setTimeout 后 1 毫秒后执行,并且 val 的值将是它当时的值,所以我尝试增加重新分配val 希望克服 1ms 的延迟,直到回调的执行,但是无论我添加了多少 val 的重新分配,val 的值始终是最后一个分配的值。所以问题是,所有这些重新分配是否发生得如此之快以至于 1 毫秒足以在执行回调之前执行它们,还是我在这里遗漏了什么?

    function asyncFunction(callback) {
       setTimeout(callback, 1);
    }

    var val= '1';

    asyncFunction(function() {
       console.log('The value is ' + val);
    });
    val= '2';
    val= '3';
    //...
    //... more asignments

    val = '1000'

【问题讨论】:

    标签: javascript asynchronous callback settimeout


    【解决方案1】:

    JavaScript 永远不会中断当前正在运行的函数来执行其他操作。

    当您将函数传递给setTimeout 时,它将在以下所有条件都为真时被调用:

    • 指定的时间已过
    • 已超过 setTimeout 的最短时间
    • 没有其他函数正在执行

    延伸阅读:Reasons for delays longer than specified

    【讨论】:

      【解决方案2】:

      阅读MDN - Reasons for Delays longer than specified


      需要注意的是,在调用 setTimeout() 的线程终止之前,函数或代码 sn-p 无法执行。例如:

      function foo() {
          console.log('foo has been called');
      }
      setTimeout(foo, 0);
      console.log('After setTimeout');
      

      将写入控制台:

      After setTimeout
      foo has been called
      

      因为即使 setTimeout 的调用延迟为零,它也会被放置在队列中并计划在下一个机会运行,而不是立即运行。当前执行的代码必须在队列上的函数执行之前完成,结果执行顺序可能与预期不符。

      【讨论】: