MobX работает как электронная таблица, все происходит из состояния. Даже эффекты с такими вещами, как autorun
.
Проблема для меня заключается в том, что неясно, когда запускать эффект, основанный на некотором срабатывании события, а не на изменении состояния (используя autorun
или что-то подобное это).
Например, скажем, мне нужно получить немного молока (действие, которое вызывает запрос HTTP - отсюда и эффект) после того, как будут выполнены 3 заданных условия c (получено из состояния). Я могу использовать when
для запуска этого побочного эффекта:
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
))
Возвращаясь к названию моего вопроса, для меня это «реакция на событие» - событие в этом случае является ответом сервис fetchMilk()
.
Что если я просто отреагирую на изменение состояния, а не на событие?
Это означает, что track()
также необходимо поместить в реакцию, и поскольку это зависит от ответа fetchMilk()
, я могу просто сохранить это в хранилище MobX и отреагировать на него:
when(
() => {
if (
self.milk.user &&
self.milk.order
) {
return true;
}
return false;
},
() => self.track(self.milk.user, self.milk.order),
);
Обратите внимание, что вместо использования потока "на основе обещаний" для обработки асинхронного поведения c, я просто реагирую на изменение значений.
Мой вопрос: какой из этих двух вариантов мне следует выбрать? использовать? Каковы преимущества / недостатки каждого подхода? Безопасно ли моделировать асин c поведение, используя второй подход?