Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

После fail executon всея ячейки дерева state ACTUAL #46

Closed
dwfe opened this issue Jul 10, 2022 · 4 comments
Closed

Comments

@dwfe
Copy link

dwfe commented Jul 10, 2022

Привет.

Пример простого дерева:

const a = new Cell(() => b.get());
const b = new Cell(() => c.get());
const c = new Cell(() => {
	throw new Error('123');
});
a.onChange(()=>{});
expect(a._state).eq(CellState.ACTUAL)
expect(a._error).exist;
expect(b._state).eq(CellState.ACTUAL)
expect(b._error).exist;
expect(c._state).eq(CellState.ACTUAL)
expect(c._error).exist;

Каждая из ячеек содержит ошибку и при этом ее состояние актуально.
Вроде странно, но ок если принять, что error наряду с value является частью состояния ячейки.
Изменил состояние error - сделал статус актуальным(если соблюдаются условия).

Вот пример по-интереснее:

const truthy = new Cell(true);
const a = new Cell(() => b.get());
const b = new Cell(() => {
	const prefix = truthy.get() ? 'truthy' : r.get();
	if (!truthy.get())
		throw new Error('not truthy');
	return prefix + c.get();
});
const c = new Cell(() => d.get());
const d = new Cell(7);
const r = new Cell(() => s.get());
const s = new Cell('hello');

a.onChange(()=>{});
truthy.set(false);
Cell.release();
expect(a._state).eq(CellState.ACTUAL)
expect(a._error).exist;
expect(b._state).eq(CellState.ACTUAL)
expect(b._error).exist;

после truthy.set(false);
от b строится ветка b -> r -> s,
но при этом из-за ошибки отваливается ветка b -> c -> d.
Тело функции выполнено не до конца, появились новые зависимости. Старые зависимости отвалились из-за экстренного выхода при выполнении функции. И в общем случае неизвестно сколько новых веток не создалось.
Есть ощущение, что в таком кейсе ставить b и всем ее реакциям статус ACTUAL не совсем верно.

Это я все к тому, что может быть есть смысл всем ячейкам, где возникла ошибка, ставить DIRTY?

@Riim
Copy link
Owner

Riim commented Jul 11, 2022

ок если принять, что error наряду с value является частью состояния ячейки

Да, так и задумано. Значение (Cell#value) при этом сохраняется от предыдущего вычисления, иногда это очень удобно.

Это я все к тому, что может быть есть смысл всем ячейкам, где возникла ошибка, ставить DIRTY?

Тогда при каждом чтении ячейка будет каждый раз вычисляться и падать с ошибкой. Смысл её вычислять если зависимости не менялись и результат будет тот же самый. Лишние вычисления получаются.

@gonzobard777
Copy link

Тогда при каждом чтении ячейка будет каждый раз вычисляться и падать с ошибкой. Смысл её вычислять если зависимости не менялись и результат будет тот же самый.

в том то и дело, что те зависимости, которые успели образоваться, пока выполнение функции не было прервано, они с вероятностью 50/50 не полные.

@Riim
Copy link
Owner

Riim commented Jul 11, 2022

Почему же? А если if (a.get()) { return; } посреди функции и есть чтение зависимостей ниже, тогда тоже не полные? Не нужно воспринимать исключения как что-то ненормальное, скорее как некую форму return.

@dwfe
Copy link
Author

dwfe commented Jul 11, 2022

Вроде доехал до двух вариантов(может есть еще варианты?):

Вариант 1.
ошибка возникла в результате работы кода, никак не связанного с зависимостями, например:

...
const b = new Cell(() => { //ячейка в активном дереве
   const res = w.get();
   if(true) {
      throw new Error(123);
   }
   return res + c.get();
});
...

тут в принципе ничего не поможет и выставить ACTUAL корректно.

Вариант 2
ошибка возникла в результате работы зависимости, например:

...
const b = new Cell(() => { //ячейка в активном дереве
   const res = w.get();
   if(s.get() > 5) {
      throw new Error(123);
   }
   return res + c.get();
});
...

у b получаются зависимости w, s.
Если b сделать DIRTY, тогда:

  • вызов b.get() либо реакция-b.get() гарантированно зафейлится, т.к. зависимости не изменились;
  • а вот, если изменится зависимость s, тогда после автоматической актуализации есть шанс, что фейла не будет.

Значит задавать DIRTY неэффективно.


т.е. как бы
невозможна ситуация, когда зафейленная ячейка содержит "неполные" зависимости.

@dwfe dwfe closed this as completed Jul 12, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants