MobX state-based 反应与事件

MobX state-based reactions vs events

MobX 就像一个电子表格,一切都来自状态。甚至像 autorun.

这样的效果

我的问题是不清楚何时 运行 基于某些事件触发的效果,而不是基于 state-change(使用 autorun 或类似的东西) .

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

when(
    () => {
        if (
            self.isOnConfirmationPage &&
            paymentStore.successfullySubscribed &&
            calendarStore.isFriday
        ) {
            return true;
        }
        return false;
    },
    () => self.fetchMilk(),
);

一个新的要求要求我添加一些日志记录。具体来说,我需要调用一个 track() 服务(另一个 HTTP 请求,因此产生另一个效果),但是这个 track() 服务取决于 fetchMilk() 服务返回的数据.

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

self.fetchMilk().then(milkResponse => self.track(
   milkResponse.user,
   milkResponse.order
))

回到我的问题标题,这对我来说是 "reacting based on an event" - 在这种情况下,事件是 fetchMilk() 服务的响应。

如果我只是根据 state-change 而不是事件做出反应怎么办?

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

when(
    () => {
        if (
            self.milk.user &&
            self.milk.order
        ) {
            return true;
        }
        return false;
    },
    () => self.track(self.milk.user, self.milk.order),
);

请注意,我没有使用 "promise-based" 流程来处理异步行为,我只是根据值的变化做出反应。

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

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

当您希望将应用中的更改广播 到全世界时,您就进入了 mobx 世界。

仔细想想,mobx 就像一个事件派发器,但事件派发代码(订阅和通知)隐藏在 mobx 魔法的背后。 所以根据我的经验,最好的选择是完成所有你需要做的异步工作,然后 notify mobx 的变化。

如果您看一下 the official documentation,它有一个使用异步代码的示例,它就是这样做的。