异步代码执行

时间:2017-04-27 10:36:42

标签: javascript asynchronous callback settimeout

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

    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'

2 个答案:

答案 0 :(得分:3)

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

当您将函数传递给setTimeout时,如果满足以下所有条件,则会调用该函数:

  • 指定的时间已过了
  • 已经过了setTimeout的最短时间
  • 没有其他功能正在执行

进一步阅读:Reasons for delays longer than specified

答案 1 :(得分:0)

阅读MDN - Reasons for Delays longer than specified

请注意,在调用setTimeout()的线程终止之前,无法执行函数或代码段。例如:

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

将写入控制台:

After setTimeout
foo has been called
  

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