Реакции MobX на основе состояний против событий - PullRequest
1 голос
/ 04 мая 2020

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 поведение, используя второй подход?

1 Ответ

2 голосов
/ 05 мая 2020

Я бы go для версии promise.then() просто потому, что легче следовать потоку кода. Нет правила, согласно которому все в приложении должно быть настроено так, чтобы весь код управлялся действиями и реакциями mobx.

Когда вы хотите, чтобы изменение в приложении было транслируемым в мир, то вы входите в мир MOBX.

Когда вы думаете об этом, mobx подобен диспетчеру событий, но код отправки событий (подписки и уведомления) скрыты за mobx magi c. Так что, по моему опыту, лучший вариант - выполнить всю асинхронную c работу, которую вам нужно сделать, а затем уведомить mobx об изменениях.

Если вы посмотрите на в официальной документации есть пример использования асинхронного кода, который делает именно это.

...