Наверняка вы заметили, что функция должна быть чистой… или следить за тем, чтобы в ней не было побочных эффектов. Мы поговорим об этом в текущем разделе – Приоритет вычислений.
Реальный пример приоритета в очереди — люди, ожидающие медицинской помощи в больнице, экстренные случаи будут иметь наивысший приоритет и перемещаться в начало очереди, а менее значительные — в конец.
Приоритет вычислений позволяет нам иметь побочные эффекты, и это одна из основных причин создания этой концепции:
- Позволяет сначала выполнить чистые функции.
- Побочные эффекты могут следовать за согласованным состоянием приложения.
На самом деле, чистое вычисление не может быть наблюдаемо вне своей области видимости, поэтому определение чистого вычисления, используемое в этой библиотеке, дает нам возможность оптимизировать группировку.
Приоритет:
1. child -> forward
2. pure -> map, on
3. sampler -> sample, guard, combine
4. effect -> watch, обработчик эффекта
Всякий раз, когда вы разрешаете побочные эффекты в чистых вычислениях, библиотека будет работать по наихудшему сценарию. Тем самым увеличивая несогласованность приложения и нарушая чистые вычисления. Не игнорируйте это.
Давайте рассмотрим приоритизацию на примере ниже.
let count = 0;
const fx = createEffect(() => {
// побочный эффект 1
count += 1;
});
fx.done.watch(() => {
// побочный эффект 1 уже выполнен
console.log("ожидаем, что count будет 1", count === 1);
// побочный эффект 2
count += 1;
});
fx();
// побочный эффект 1 уже выполнен
// побочный эффект 2 также уже выполнен
// это то, что мы ожидали
// это эффект watchmen
console.log("ожидаем, что count будет 2", count === 2);
// пример, который нарушает это соглашение: setState в react
// который откладывает любой побочный эффект на долгое время после вызова setState
Всякий раз, когда библиотека замечает побочный эффект в чистой функции, она перемещает его в конец очереди приоритетов.
Мы надеемся, что эта информация прояснила некоторые моменты в том, как работает библиотека.
Документация на английском языке - самая актуальная, поскольку её пишет и обновляет команда effector. Перевод документации на другие языки осуществляется сообществом по мере наличия сил и желания.
Помните, что переведенные статьи могут быть неактуальными, поэтому для получения наиболее точной и актуальной информации рекомендуем использовать оригинальную англоязычную версию документации.