Angular toSignal(toObservable()) возвращает неопределенное значение
Привет, если предположить следующий код
import { Signal } from '@angular/core';
import { toObservable, toSignal } from '@angular/core/rxjs-interop';
const result = toSignal(toObservable(signal(10)))
console.log(result()) // does log undefined instead of 10
Я бы предположил, чтоresult()
вернется10
вместоundefined
. Однако кажется, что я что-то упускаю, но я не знаю что.
2 ответа
Этот эффект, который вы видите, связан с текущей реализацией toObservable. Если вы посмотрите на реализацию, вы увидите, что выбросы создаются внутри эффекта. Эффекты всегда выполняются асинхронно во время цикла обнаружения изменений. Поэтому вы не можете рассчитывать на то, что они побегут немедленно.
Если подумать, это лучшее, что можно было сделать. Например, он мог бы выполнить первоначальную эмиссию до того, как наблюдатель (subject.next(source())
), но...
- Без каких-либо защит первое выполнение эффекта потенциально могло бы вызвать двойную эмиссию одного и того же значения.
- Можно было бы создать логическую переменную, чтобы пропустить выброс при первом выполнении эффекта, но невозможно узнать, изменился ли исходный сигнал до запуска этого первого эффекта .
- Вместо логического значения наблюдатель мог бы сравнить текущее значение с исходным значением и выдать только изменения, но, возможно, функция равенства сигнала была установлена на что-то, требующее повторных выбросов, и теперь вы потенциально пропускаете действительные выбросы.
Поэтому примите как должное, что первая эмиссия наблюдаемого, созданного из toObservable , будет отложена.
Тип возвращаемого значенияtoSignal
имеетSignal<number | undefined>
Прежде чем Observable выдаст свое первое значение, Signal вернет неопределенное значение.
Чтобы избежать этого, можно передать начальное значение или включить опцию requireSync.
const result = toSignal(toObservable(signal(10)),{ initialValue: 10 })
console.log(result()) //logs intial value 10