AngularJS 1.x 的 $watch 和 RxJS Observable 的比较

前言

前端开发中常常需要监听某些数据的变化来更新页面,其中 AngularJS 1.x 中的 $watch 和 RxJS 中的 Observable 都是比较常用的技术,本文将对两种技术的使用场景、优缺点做详细的比较并给出示例代码,帮助读者选择合适的方式。

$watch

在 AngularJS 1.x 中,$watch 是用来监听一个 AngularJS 模型对象的变化,一旦对象有变化,就对应执行某个方法。例如以下代码:

这里用 $watch 监听了 $scope.name,并且在变化时执行了回调函数,输出变化前后的值。$watch 和 AngularJS 提供的双向绑定是密切相关的,一旦 $scope.name 发生变化,绑定该数据的页面也会相应变化。

优点

  • AngularJS 内置支持,使用较为方便;
  • 在监听对象的属性时,可以使用点语法来监听对象内部属性的变化。

缺点

  • 不支持 Promise 的异步处理;
  • 多个 $watch 会影响性能;
  • 可能会导致循环依赖的问题;
  • 大规模数据监测性能问题。

Observable

Observable 是 RxJS 中的一个特性,可以用来监听数据流中的数据变化。在这里,数据流可以是一个数组、事件、HTTP 请求甚至是用户输入等等。

这里用 of 操作符创建了一个 Observable 对象,我们通过 subscribe 方法来监听其中的数据变化。

优点

  • 接收的数据可以是异步的,支持 Promise 和其他异步请求;
  • 执行效率高;
  • 可以在多个流中复用代码。

缺点

  • 学习成本较高;
  • 需要手动管理订阅的生命周期。

比较

应用场景

AngularJS 中的 $watch 主要用于单向数据绑定,与 AngularJS 的双向数据绑定是结合使用的,适用于监听模型数据的变化。Observable 适用于监听各种异步数据流的变化。

学习成本

AngularJS 的 $watch 作为 AngularJS 的内置特性,使用起来较为简单。而 Observable 相比之下,需要更多的学习成本,不过 RxJSExt 库提供了许多工具来简化 Observable 的使用。

性能表现

$watch 监听的数据一旦开启较多,会严重影响运行效率。Observable 虽然在数据流多时表现良好,但同时需要考虑订阅的生命周期管理问题。

结论

选用何种方式主要依据业务需求和个人技术水平。对于单向数据绑定的场景,建议使用 $watch;对于异步数据流监听的场景,建议使用 Observable。无论选哪种方式,都需要根据具体情况权衡其优、缺点来做出最终的决定。

示例代码

以下代码给出了一个使用 $watch 和 Observable 监听数组变化的示例:

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/673496b50bc820c5824a0501


纠错
反馈