http-запрос в Observable происходит даже без подписки - PullRequest
0 голосов
/ 13 ноября 2018

Я наблюдаю запрос http - на вкладке Chrome Network, а также при использовании then() в обещании получения - с приведенным ниже кодом, несмотря на то, что никогда не подписывался на внутреннюю наблюдаемую (saveCourses$).

Я изменил для использования from() вместо fromPromise() согласно обновленной документации rxjs, но происходит то же самое.

Насколько я понимаю, что внутренняя наблюдаемая не должна работать?

ngOnInit() {
  this.form.valueChanges.pipe(
    filter(() => this.form.valid)
  )
    .subscribe(changes => {
      const saveCourses$ = fromPromise(fetch(`/api/courses/${this.course.id}`, {
        method: 'PUT',
        body: JSON.stringify(changes),
        headers: {
          'content-type': 'application/json'
        }
      }));
    });
}

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Хотя интерфейсы на основе 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 вызван, когда Наблюдаемое создано , а не когда подписано .

0 голосов
/ 13 ноября 2018

Прекратите использовать fetch и используйте HttpClient. Если вы откроете консоль и наберете fetch('foo'), вы увидите сетевой запрос. Проблема заключается в вызове до fromPromise.

...