JavaScript异步编程4种模式:回调、事件、发布/订阅与Promise

慢慢来
慢慢来
发布时间:2026-10-14| 6人浏览过
原创

JavaScript 语言的执行环境是“单线程”(single thread),即一次只能完成一件任务。当遇到耗时操作时,若采用同步等待会拖慢整体程序甚至导致页面假死。因此,JavaScript 将任务分为同步与异步两种模式。本文详细解析异步编程的四种核心实现方式:回调函数、事件监听、发布/订阅模式以及 Promises 对象,帮助开发者根据场景选择最合适的方案。

理解 JavaScript 的单线程与异步机制

在浏览器端,耗时较长的操作必须异步执行,以避免浏览器失去响应;而在服务器端(如 Node.js),由于也是单线程环境,异步模式更是唯一的选择。

所谓的“同步模式”,是指后一个任务等待前一个任务结束后再执行,顺序一致。而“异步模式”则完全不同,每个任务通常包含一个或多个回调函数。当前一个任务结束时,不是去执行下一个队列任务,而是执行其对应的回调函数,其他任务则可以并行不悖地继续执行。这种非线性的执行顺序正是异步的核心特征。

在实际开发中,常见的 Ajax 操作就是典型的异步应用。为了写出结构合理、性能出色且易于维护的 JavaScript 程序,理解以下几种异步编程模式至关重要。

第1步:使用回调函数(Callback)实现基础异步

目的:通过参数传递的方式,将耗时任务的后续逻辑推迟执行,避免阻塞主线程。

原理:假定有两个函数 f1 和 f2,正常情况下 f2() 会立即执行。若 f1 是耗时任务,可改写 f1,将其作为接受回调参数的函数。

function f1(callback) {
    setTimeout(function () {
        // f1的任务代码
        callback();
    }, 1000);
}

// 执行时传入f2作为回调
f1(f2);

优缺点:优点是实现最简单,易于部署。缺点是各个部分之间高度耦合(Coupling),代码流程混乱,且每个任务通常只能指定一个回调函数,难以处理复杂的依赖关系。

第2步:利用事件监听(Event Listening)解耦任务

目的:采用事件驱动模式,让任务的执行取决于特定事件是否发生,而非代码的线性顺序。

原理:以 jQuery 为例,为 f1 绑定一个 done 事件来触发 f2。随后在 f1 内部执行完任务后,主动触发该事件。

// 绑定事件
f1.on('done', f2);

// 修改f1,在执行末尾触发事件
function f1() {
    setTimeout(function () {
        // f1的任务代码
        f1.trigger('done');
    }, 1000);
}

优缺点:优点是能够解耦(Decoupling),支持多事件和多回调,有利于模块化。缺点是整个程序逻辑变为事件驱动型,运行流程对于新手来说可能不够直观。

第3步:引入发布/订阅模式(Publish/Subscribe)

目的:设立一个独立的“信号中心”,彻底隔离任务发布者与订阅者,实现对程序运行的监控。

原理:又称观察者模式。任务执行完成后,向信号中心“发布”信号;其他任务提前“订阅”该信号。一旦收到信号,订阅者即可开始执行。可以使用 jQuery 插件 Tiny Pub/Sub 或原生实现。

// f2订阅“done”信号
jQuery.subscribe("done", f2);

// f1执行后发布信号
function f1() {
    setTimeout(function () {
        jQuery.publish("done");
    }, 1000);
}

// 任务完成后可取消订阅
jQuery.unsubscribe("done", f2);

优缺点:比事件监听更优之处在于,可以通过查看消息中心了解有多少信号及订阅者,从而便于监控程序状态。性质上与事件监听类似,但关注点分离更彻底。

第4步:采用 Promises 对象标准化异步流程

目的:提供统一的异步编程接口,支持链式调用、错误处理及更清晰的流程控制。

原理:CommonJS 工作组提出的规范,异步任务返回一个 Promise 对象,拥有 then 等方法指定回调。以下是基于 jQuery Deferred 的实现示例:

function f1() {
    var dfd = $.Deferred();
    setTimeout(function () {
        // f1的任务代码
        dfd.resolve(); // 任务成功
    }, 500);
    return dfd.promise;
}

// 链式调用
f1().then(f2).then(f3);

// 错误处理
f1().then(f2).fail(f3);

关键优势:

  • 链式写法:程序流程清晰可见。
  • 状态管理:如果任务已完成再添加回调,回调会立即执行,不用担心错过事件。
  • 配套功能:内置标准的错误处理(fail/catch)等强大功能。

注意:Promises 的主要挑战在于编写和理解相对复杂,但在现代 JavaScript (ES6+) 中已成为主流标准。

简要总结

从基础但易耦合的回调函数,到解耦的事件监听,再到灵活可监控的发布/订阅,最后到标准化且强大的 Promises 对象,JavaScript 异步编程模式的演进体现了对代码结构和可维护性的不断追求。在实际项目中,建议优先使用 Promises 或其衍生语法(Async/Await)来处理复杂的异步逻辑,而在简单的独立场景中,回调函数依然高效直接。

以上就是 JavaScript 异步编程 4 种模式的详细内容,更多关于 JavaScript 并发编程的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。