0 javascript concurrency callstack asynchronous event-loop
JavaScript 代码在单线程上运行,在事件循环中,当方法推送到 Web api 时,将回调函数返回到队列,侦听器队列和调用堆栈为空推送回调函数在调用堆栈中执行它,因此异步执行实际上只是更改了功能?为什么?
小智 5
由于 JavaScript 是单线程的,从技术上来说它只是并发,而不是并行。也就是说,不会同时执行两条指令,但事件循环允许我们协调指令的执行顺序,以便某些指令是非阻塞的。
要了解其为何有用,请考虑以下步骤顺序:
第 1 步可能需要相当长的时间,我们可能希望在等待它完成的同时做一些其他工作,从而使其成为阻塞调用。在纯粹的顺序世界中,这意味着在步骤 1 完成之前,步骤 2 不会执行。相比之下,如果我们使其异步,从而成为非阻塞,我们可以同时执行步骤 1 和 2 。发生这种情况是因为事件循环将首先运行我们的同步代码的迭代(步骤 2),然后运行我们的异步代码(步骤 1) - 它正在改变指令的执行顺序,使我们的代码是非阻塞的。有趣的是,这意味着在下一次同步代码迭代之后将运行 0 秒的异步延迟。
假设我们引入步骤 3,其中我们需要步骤 1 中 API 调用的响应。为此,我们可以使用async-await,它将阻塞直到步骤 1 完成。这不是纯粹的顺序,因为步骤 2 不需要等待步骤 1 完成,但在步骤 3 中,我们可以通过async-await在代码中创建同步点。因此,我们能够在重要的地方保持代码非阻塞,并且仍然引入特定的事件序列。
| 归档时间: |
|
| 查看次数: |
1597 次 |
| 最近记录: |