Хотя интерфейсы на основе Observable обычно откладывают дорогостоящую работу (например, сетевые вызовы) до тех пор, пока они не подписаны , это не обязательно обязательно. Иногда метод, который возвращает Observable, уже проделал или начал большую работу даже до вызова метода subscribe . Если Observable работает до его подписки, его часто называют «горячим» (в отличие от «холодных» Observable, которые не работают, если подписчики не подключены). См. «Горячие и холодные наблюдаемые» раздел здесь.
Promise * Основанные на 1010 * интерфейсы работают во многом как "горячие" Observables. То есть мы ожидаем, что потенциально дорогая операция будет запущена, как только мы вызовем функцию, которая дает нам Обещание. Мы узнаем о результате операции, когда Обещание разрешено, но оно решит, действительно ли мы его слушаем (т.е. подключаем обработчик «затем» к Обещанию).
В вашем примере ваш Observable создан методом fromPromise
:
fromPromise(fetch(`/api/courses/${this.course.id}`...)
fromPromise работает, по сути, в ожидании разрешения Обещания и, когда это происходит, испускает разрешенное значение Обещания через вновь созданную Наблюдаемую. Здесь важно то, что fromPromise
должен вызвать fetch () , чтобы получить Обещание, из которого построен Observable. А сам акт вызова вызывает выборку сетевого вызова.
Так что в этом случае, но в отличие от большинства «типичных» применений Observables для сетевых или других длительных операций, вам не нужно вызывать .subscribe () для выполнения операции. Он будет выполнен, как только будет вызван fetch
, а fetch
вызван, когда Наблюдаемое создано , а не когда подписано .