если this.to.url
и this.to.body
являются динамическими c, вы не можете использовать mergeMapTo
... вы должны использовать mergeMap
, чтобы их можно было повторно оценивать при каждом выбросе, а не только один раз, когда поток построен:
mergeMap(() =>
this._outputProvider
.getData(this.to.url, this.to.body ? this.to.body : undefined)
),
вы также можете действительно захотеть switchMap
или exhaustMap
вместо mergeMap
... поведение немного отличается.
с mergeMap
, каждое излучение внешнего будет запускать внутреннее, и все внутренние будут излучать, пока они не завершатся. они прибудут в том порядке, в котором они прибыли, а не в том порядке, в котором они были инициированы внешним источником. так что это может привести к ненужным http-вызовам в лучшем случае или получению устаревших данных в худшем случае.
с switchMap
новые выбросы приведут к отмене предыдущих внутренних наблюдаемых, которые все еще активны, и это приведет к переключиться на новый звонок.
exhaustMap
- это своего рода противоположность, он будет игнорировать внешние выбросы, пока активен любой внутренний. он редко используется, но сигнал refre sh - это вариант использования classi c, поскольку обычно вы не хотите перезапускать refre sh или запускать больше, пока refre sh уже находится в полете.