Javascript MobX基于状态的反应与事件

Javascript MobX基于状态的反应与事件,javascript,reactive-programming,mobx,Javascript,Reactive Programming,Mobx,MobX的工作原理就像一个电子表格,一切都来自于状态。使用类似于自动运行的功能甚至可以产生效果 我的问题是,不清楚什么时候应该基于某个事件触发运行效果,而不是基于状态更改(使用autorun或类似的方法) 例如,假设我需要在满足3个特定条件(从状态派生)后获取一些牛奶(一个导致HTTP请求的操作-因此产生效果)。我可以在运行此副作用时使用: 什么时候( () => { 如果( self.ison确认页面&& paymentStore.com已成功订阅&& calendarStore.isFrid

MobX的工作原理就像一个电子表格,一切都来自于状态。使用类似于
自动运行
的功能甚至可以产生效果

我的问题是,不清楚什么时候应该基于某个事件触发运行效果,而不是基于状态更改(使用
autorun
或类似的方法)

例如,假设我需要在满足3个特定条件(从状态派生)后获取一些牛奶(一个导致HTTP请求的操作-因此产生效果)。我可以在运行此副作用时使用

什么时候(
() => {
如果(
self.ison确认页面&&
paymentStore.com已成功订阅&&
calendarStore.isFriday
) {
返回true;
}
返回false;
},
()=>self.fetchMilk(),
);
一个新的要求要求我添加一些日志记录。具体地说,我需要调用一个
track()
服务(另一个HTTP请求因此产生另一个效果),但是这个
track()
服务取决于
fetchMilk()
服务返回的数据

现在我可以简单地将
.then()
添加到我的fetchMilk中:

self.fetchMilk().then(milkResponse=>self.track(
milkResponse.user,
米尔克响应命令
))
回到我问题的标题,这对我来说是“基于事件的反应”——在本例中,事件是
fetchMilk()
服务的响应

如果我只是根据状态变化而不是事件做出反应会怎么样

这意味着
track()
也需要放在反应中,因为它取决于
fetchMilk()
的反应,所以我可以简单地将其存储在MobX存储中并对其进行反应:

什么时候(
() => {
如果(
自我牛奶用户&&
自订
) {
返回true;
}
返回false;
},
()=>self.track(self.milk.user,self.milk.order),
);
请注意,我不是使用“基于承诺”的流来处理异步行为,而是根据值的变化做出反应


我的问题是:我应该使用这两个选项中的哪一个?每种方法的优点/缺点是什么?使用第二种方法对异步行为建模安全吗?

我会选择
promise.then()
版本,因为它更容易遵循代码流。 没有规则规定应用程序中的所有内容都必须进行设置,以便所有代码都由mobx操作和反应驱动

当您希望将应用程序中的更改广播到世界时,您将进入mobx世界

仔细想想,mobx就像一个事件调度程序,但是事件调度代码(订阅和通知)隐藏在mobx magic后面。 因此,根据我的经验,最好的选择是执行所有需要执行的异步工作,然后将更改通知mobx

如果您看一看,它有一个使用异步代码的示例,它正是这样做的