JavaScript代码运行在单个线程上,在事件循环中当方法push到web api返回回调函数到队列,侦听器队列和callstack是空的push回调函数在callstack中执行它,所以异步执行真的只是改变函数的执行顺序吗?为什么?
由于JavaScript是单线程的,所以技术上只有是并发的,不并行。也就是说,不会同时执行两个指令,但是事件循环允许我们协调指令执行的顺序,以便某些指令非阻塞.
要了解为什么这很有用,请考虑以下步骤序列:- 调用API
- 做一些其他的工作
步骤1可能需要相当长的时间,在等待它完成的同时,我们可能想要做一些其他的工作,使其成为阻塞呼叫在纯顺序的情况下,这意味着在步骤1完成之前不会执行步骤2。相比之下,如果将设置为异步,因此是非阻塞的,可以同时执行步骤1和步骤2。这是因为事件循环将首先运行同步代码的迭代(步骤2),然后是运行我们的异步代码(第1步)——它改变了指令执行的顺序,使我们的代码非阻塞。有趣的是,这意味着0秒的异步延迟将在之后运行。代码的下一次同步迭代。
假设我们引入步骤3,其中我们需要步骤1中API调用的响应。为此,我们可以使用async-await,将阻塞直到步骤1完成。这不是纯顺序的,因为步骤2不需要等待步骤1完成,但是在步骤3中,我们可以通过async-await在代码中创建一个同步点。。所以我们可以保持我们的代码不阻塞在重要的地方,仍然引入一个特定的事件序列。