Size: a a a

2020 March 22

🦉⁣

🦉 ⁣ in ☄️ effector
The Fallen Phoenix
Не хватает интуиции о том, как именно очистка распространяется по графу. В тестах есть намеки, можно разобраться по исходникам.
похоже нужен доклад с визуальным пояснением очистки)
источник

l

la gente está muy loca in ☄️ effector
The Fallen Phoenix
Я понимаю. Вопрос, не уберет ли лишнего, если у меня есть некоторая часть графа, которая "вечная", и я еще хочу считать вычисляемые узлы, которые зависят от обоих сразу.
источник

T

The Fallen Phoenix in ☄️ effector
Мне кажется можно это сделать относительно малой кровью.
источник

T

The Fallen Phoenix in ☄️ effector
Да-да, это намеки я назвал =)
источник

l

la gente está muy loca in ☄️ effector
Переслано от la gente está muy loca
короче как я уже упомянул выше, в эффекторе появился второй граф, граф принадлежности

пример
const a = createStore(0)
const b = a.map(x => x + 1)

порождает

1) граф зависимостей:

a → ab → b


который означает, что после стора a вычислится промежуточная нода ab (в которой находится функция-инкремент), после чего вычислится стор b

2) граф принадлежности (ownership):

a → ab ← b


который означает, что ab принадлежит нодам a и b и должен быть уничтожен при вызове clearNode любой из них. по дефолту все эвенты, сторы и эффекты всегда regular (ни от кого не зависят), но в ряде мест, в частности при создании эффектов, тип crosslink приписывается нодам явно, что позволяет уничтожать effect.done и effect.fail при уничтожении самого эффекта. а так как это всё же граф, то при создании ватчеров, тип crosslink  присваивается уже эффекту, что делает весь сектор графа вида
. effect → effect.done 
.   \
.     → effect.fail
зависимым от стора
. store → effect → effect.done 
.             \
.                → effect.fail
источник

l

la gente está muy loca in ☄️ effector
Переслано от la gente está muy loca
источник

l

la gente está muy loca in ☄️ effector
Переслано от la gente está muy loca
стрелка own означает, что при удалении исходной ноды так же будет удалена и конечная
источник

l

la gente está muy loca in ☄️ effector
Переслано от la gente está muy loca
поэтому вот пример графов посложнее, с новыми ватчерами
источник

l

la gente está muy loca in ☄️ effector
Переслано от la gente está muy loca
источник

l

la gente está muy loca in ☄️ effector
Переслано от la gente está muy loca
граф зависимостей обозначает то, что после чего будет выполняться
граф принадлежности означает иерархию, удаление каких нод повлечёт за собой удаление других
источник

l

la gente está muy loca in ☄️ effector
Переслано от la gente está muy loca
вот то, как такой код бы выглядел ранее:

const a = createStore(0)
const b = a.map(x => x + 1)
const fx = createEffect('fx', {
 handler: x => console.log(x),
})

forward({
 from: b,
 to: fx,
})
источник

l

la gente está muy loca in ☄️ effector
Переслано от la gente está muy loca
если рассмотреть его структуру, то будет заметно одно различие
источник

l

la gente está muy loca in ☄️ effector
Переслано от la gente está muy loca
fx тут не принадлежит b, потому что теперь это равноправные, независимые сущности
источник

l

la gente está muy loca in ☄️ effector
Переслано от la gente está muy loca
проявляется это как то, что при вызове clearNode(b) во втором случае удалится только нода b, а в первом случае как b, так и fx, fx.done и fx.fail, потому что они все находятся в одной и тоой же ветке графа принадлежности
источник

l

la gente está muy loca in ☄️ effector
Переслано от Arthur Irgashev
т.е.

const a = store();
const b = store();

b.on(a, () => {}):

при анлоаде страницы, которая использует b, он удалится ?
источник

l

la gente está muy loca in ☄️ effector
Переслано от Arthur Irgashev
и если удалится а, то и b тоже удалится ?
источник

l

la gente está muy loca in ☄️ effector
Переслано от la gente está muy loca
при вызове clearNode(a) у тебя b не удалится, потому что ты создал его явно, отдельно, тем самым показывая, что он тебе необходим сам по себе
при clearNode(a, {deep: true}) как обычно удалится всё, до чего сможет дотянуться, в том числе и b)
источник

l

la gente está muy loca in ☄️ effector
Переслано от la gente está muy loca
вот что произойдёт, если мы удалим b в варианте, в котором всё создаётся друг от друга. удаляется b, каскадно удаляется связь a.map(x => x + 1) — ab, каскадно удаляется эффект и его эвенты
источник

l

la gente está muy loca in ☄️ effector
Переслано от la gente está muy loca
а вот что произойдёт, если мы удалим b в варианте, в котором fx — независимо созданный эффект
источник

l

la gente está muy loca in ☄️ effector
Переслано от la gente está muy loca
при этом вызов clearNode(b, {deep: true})  в обоих случаях уничтожит всё явно
источник