有什么方法可以在不引起 $digest 循环的情况下调用 $q notify 吗?

Any way to call $q notify without causing $digest cycle?

我有一个 $digest 周期大约需要 5 毫秒的应用程序,我在我的应用程序中经常使用 $q.deferdeferred.notify。问题是每次调用 deferred.notify 时,都会安排一个摘要周期,并导致 angular 运行 它持续 5 毫秒。

因此,当我从服务器获取几千行数据时(通过 WebSocket,数据一个接一个地接收),应用程序可以使用 100% CPU 并且变得非常无响应。我对这些数据所做的唯一一件事就是将它们保存到 IndexedDB 中。

有什么方法可以在不安排 $digest 周期的情况下使用 $qnotify 吗?

我正在考虑对 WebSocket 和 IndexedDB 相关代码使用不同的 promise 实现,但我不喜欢有两个 promise 实现的想法,而且几乎不可能知道长时间后会返回哪种 promise链.

我刚找到 $$q。据我了解,$q 没有摘要循环,这正是我想要的。

然而,这是一项无证私人服务。

您可以使用不同的承诺实现,或者这听起来很像 RxJS 的工作。非 angular 承诺,如浏览器本机版本或 Bluebird 不会在所有通知上触发摘要循环。然后你只需要手动消化东西 - 这就是我所做的:我使用 RxJS 来处理 websocket 事件并手动调用范围。$在需要时偶尔在适当的范围上应用(就像你一样 - 我不需要更新我的范围在每个 websocket 事件上)。