Почему мы должны использовать подписку () над картой () в Angular?

Я пытаюсь воспользоваться наблюдаемыми в angular2 и запутался, почему я должен использовать map(), а не subscribe(). Предположим, я получаю значения из WebApi, как это

  this.http.get('http://172.17.40.41:8089/api/Master/GetAllCountry')

Сейчас использую subscribe(success, error, complete) Я могу получить все значения в обратном вызове успеха, и я могу вернуть значения в полном обратном вызове. Если я могу выполнять все эти функции, то зачем map()? Это дает какое-то преимущество?

Короче, почему нужно писать так:

this.http.get('http://172.17.40.41:8089/api/Master/GetAllCountry')
    .map(r=>{})
    .subscribe(value => {
    }, error => error, () => {
});

когда они могут просто написать это без функции карты:

this.http.get('http://172.17.40.41:8089/api/Master/GetAllCountry')
    .subscribe(value => {        
    }, error => error, () => {           
});

4 ответа

Решение

Если вы хотите вернуть Observable на какой-то другой код можно подписаться, но вы все еще хотите манипулировать событиями данных в текущем методе, используйте map,

Фактический пользователь наблюдаемого должен subscribe()потому что без subscribe() наблюдаемое не будет выполнено вообще. (forEach() или же toArray() и, вероятно, другие работают так же, чтобы выполнить наблюдаемое вместо subscribe())

subscribe() возвращает Subscription на которую нельзя подписаться, но ее можно использовать для отмены подписки.

map() возвращает Observable на который можно подписаться.

Думайте о карте как о промежуточном программном обеспечении, которое трансформирует ответ.

this.http.get('http://172.17.40.41:8089/api/Master/GetAllCountry')
.map(r=>r.json())
 .subscribe(result => {
              // here result would have json object that was parsed by map handler...
            },failurCallback,completeCallback)

подписка используется для вызова наблюдаемого, пожалуйста, прочитайте хороший документ на cold-vs-hot-observables

Тебе нужно subscribe запустить ваш асинхронный запрос. Если вы просто установите map - ни один запрос не сработает. Ты можешь проверить.

Хорошая практика для использования map для предварительной обработки ваших данных, потому что многие подписчики могут перечислять ваши результаты. Таким образом, вместо добавления предварительной обработки каждому клиенту (подписчику) вы можете подготовить один вывод с единой схемой данных для всех.

Observables - это потоки, и они предназначены для записи в функциональные потоки. Вам следует использовать операции RxJS, потому что это "функциональный" способ реализации подписок для наблюдаемых. Обычно это происходит, когда мы берем данные за пределами потока Observable.

Это асинхронная операция, вынужденная работать синхронно.

bad_example() {
  let id;
  this.obs.subscribe(param => id = param['id']);
    this.get(id).subscribe(elem => this.elem = elem);
}

Это асинхронная операция, которая работает должным образом. (Как поток)

good_example() {
  this.obs
    .map(param => param['id'])
    .switchMap(id => return this.get(id))
    .subscribe(elem => this.elem = elem);
}

.map() это оператор rxjs, он покажет результат в массиве [] Форма либо .json() форма

https://www.learnrxjs.io/operators/transformation/map.html

Другие вопросы по тегам