AbhishekAK 发表于 2024-1-13 12:36:04

JavaScript 中的流程控制:回调、Promise、异步/等待

在本文中,我们将深入了解如何在 JavaScript 中使用异步代码。我们将从回调开始,继续到承诺,然后以更现代的async/await. 每个部分都将提供示例代码,概述需要注意的要点,并链接到更深入的资源。 Skip 10s 内容: 单线程处理 通过回调实现异步 回调地狱 承诺 异步链接 充满希望的未来? 异步/等待 承诺,承诺 尝试/捕捉丑陋 JavaScript 之旅 JavaScript 通常被认为是异步的。这意味着什么?它如何影响发展?近年来这种方法有何变化? 考虑以下代码: result1 = 大多数语言同步处理每一行。第一行运行并返回结果。第一行完成后,第二行就会运行——无论需要多长时间。


单线程处理 JavaScript 在单个处理线程上运行。当在浏览器选项   电话号码数据库 卡中执行时,其他一切都会停止。这是必要的,因为对页面 DOM 的更改不能在并行线程上发生;如果一个线程重定向到不同的 URL,而另一个线程尝试附加子节点,这将是危险的。 这对于用户来说很少是明显的,因为处理以小块的形式快速发生。例如,JavaScript 检测按钮单击、运行计算并更新 DOM。一旦完成,浏览器就可以自由地处理队列中的下一个项目。 (旁注:其他语言(例如 PHP)也使用单线程,但可能由多线程服务器(例如 Apache)管理。同时对同一 PHP 页面的两个请求可以启动运行 PHP 运行时的独立实例的两个线程.) 通过回调实现异步 单线程会产生问题。

https://manchestermassage.net/wp-content/uploads/2024/01/2-1.png

当 JavaScript 调用“慢”进程(例如浏览器中的 Ajax 请求或服务器上的数据库操作)时会发生什么?该操作可能需要几秒钟甚至几分钟。浏览器在等待响应时会被锁定。在服务器上,Node.js 应用程序将无法处理进一步的用户请求。 解决方案是异步处理。当结果准备好时,进程被告知调用另一个函数,而不是等待完成。这称为回调,它作为参数传递给任何异步函数。 例如:并不重要doSomethingAsync;我们所知道的是,它将callback1在未来的某个时候执行。控制台将显示: finished doSomethingAsync complete 您可以在《回归基础:JavaScript 中的回调是什么?》中阅读有关回调的更多信息。 回调地狱 通常,回调仅由一个异步函数调用。因此可以使用简洁的匿名内联函数:不幸的是,这引入了回调地狱——一个臭名昭著的概念,甚至有自己的网页!代码很难阅读,并且当添加错误处理逻辑时会变得更糟。 回调地狱在客户端编码中相对较少。

页: [1]
查看完整版本: JavaScript 中的流程控制:回调、Promise、异步/等待