autorun 和 reaction 之间的明显区别是什么以及何时使用哪个?

What are the clear differences between autorun and reaction and when to use which?

autorunreaction 有什么区别?我正在寻找有助于决定何时使用哪个的完整解释。有没有可能 reaction 甚至可以触发而 autorun 不能?它们之间有什么关系?

这两个一样吗?

autorun(() => {
  localStorage.setItem("current_order", JSON.stringify(this.currentOrder)) 
})
reaction(
  () => JSON.stringify(this.currentOrder),
  (json) => { 
    localStorage.setItem("current_order", json) 
  }
)

据我所知,reaction 的第一个参数将评估并检查更改,因此计算值需要它,但 autorun 不应该正常工作,如果 this.currentOrder 是可观察的吗? JSON.stringify(this.currentOrder)reaction 运行 中,即使 this.currentOrder 是可观察的并且没有改变?

autorun 运行s 在初始化后立即,reaction 运行s 仅在初始化后数据表达式发生变化后。

此外,因为 reaction 运行 仅当数据表达式发生变化时,您可以在效果函数中使用其他可观察值,这对 autorun 不起作用,因为它订阅了所有可观察值你在它里面使用,这意味着 reaction 提供了更细粒度的控制。

编辑:

添加示例以使其更清楚

考虑这个例子,你有两个可观察对象 A 和 B,并且想在 A 改变时对 B 做一些事情,但不想在 B 改变时做任何事情。如果你只是 autorun 它会 运行 当任何可观察值发生变化时,所以这不是你想要的。但是使用 reaction 可以只对 A 的变化做出反应(通过仅在表达式函数中使用 A)。