如果在执行期间更新依赖项,计算的 属性 会停止计算吗?

Will a computed property stop computing if a dependency is updated during execution?

假设您有一个计算 属性,它根据用户的输入过滤和排序一组值。

如果用户开始从数组中过滤值,并且排序值在过滤计算过程中发生变化,计算的 属性 会继续执行过滤,还是计算的 属性 跳转到队列中已计算属性的下一次计算,使用新的排序值?

Javascript 是(本质上)单线程的。这意味着在当前执行的同步代码完成执行之前,甚至没有任何东西可以处理用户触发事件发生的事实。

不过,您可以自己做一些事情来模仿这一点。在释放允许处理事件的 运行 循环的地方添加异步暂停,然后恢复并检查一些取消条件,然后您可能能够实现您所要求的目标。但那是很多代码,除非过滤真的慢,否则这可能是个坏主意。

计算属性将完全完成执行。

如果 old Vue.js v2 documentation 仍然具有任何相关性,则以下段落说明更改如何导致更新:

[...]Vue performs DOM updates asynchronously. Whenever a data change is observed, it will open a queue and buffer all the data changes that happen in the same event loop. If the same watcher is triggered multiple times, it will be pushed into the queue only once. This buffered de-duplication is important in avoiding unnecessary calculations and DOM manipulations. Then, in the next event loop “tick”, Vue flushes the queue and performs the actual (already de-duped) work.

鉴于 JavaScript 是一种单线程语言,这意味着在事件循环的任何特定“滴答”期间,在该“滴答”期间的代码执行完成之前不会处理其他操作.

如果假设 Vue 的内部行为是这样的,这些更新是纯粹异步处理的,那么任何两个事件循环滴答之间都可能存在竞争条件,特别是如果第一个滴答需要很长时间才能完成,而第二个滴答滴答声很快结束。中止计算 属性 的执行,即使有可能,也可能导致通常由计算 属性 的执行触发的任何副作用(不好的做法,但这是另一个主题)不会被触发。

这些行为上的不一致会导致维护应用程序状态一致性的各种问题,这个问题会使任何反应式框架实际上变得毫无价值。