2017-02-20 38 views
16

Próbuję skorzystać z obserwabli w kanoncie2 i wprawili mnie w zakłopotanie, dlaczego powinienem używać funkcji map() zamiast subskrybowania(). Załóżmy otrzymuję wartości z WebAPI, jak todlaczego powinniśmy używać funkcji subscribe() over map() in angle2?

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

Teraz używając subscribe(success, error, complete) mogę uzyskać wszystkie wartości na zwrotnego sukces i mogę powrócić wartości na kompletnej zwrotnego. Jeśli mogę zrobić wszystkie te funkcje, to jaka jest potrzeba map()? Czy daje jakąkolwiek przewagę?

W skrócie, dlaczego trzeba pisać tak:

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

kiedy można po prostu napisać to bez funkcji mapy:

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

subskrybować i mapa jest całkowicie różne od siebie, proszę przejść dokumentacji –

+0

I zostały zaktualizowane moje pytanie, proszę mieć spójrz na to: –

+1

.map (r => {}) spowoduje nieokreśloną wartość. Proszę wyjaśnić swoją sprawę w rozsądny sposób, jeśli szukasz rozsądnej odpowiedzi. – estus

Odpowiedz

25

Jeśli chcesz zwrócić Observable inny kod może subskrybować, ale nadal chcesz manipulować zdarzeniami danych w bieżącej metodzie, użyj map.

Rzeczywisty użytkownik obserwowalnych potrzeb do subscribe(), ponieważ bez wartości subscribe() obserwowalny obiekt nie zostanie w ogóle wykonany. (forEach() lub toArray() i prawdopodobnie inni pracują jak dobrze wykonać obserwowalny zamiast subscribe())

subscribe() zwraca Subscription, które nie mogą być subskrybowane, ale może być używany, aby anulować subskrypcję.

map() zwraca Observable, który można subskrybować.

7

Potrzebujesz subscribe, aby uruchomić swoje żądanie asynchroniczne. Jeśli ustawisz tylko map - żadne żądania nie będą wyzwalane. Możesz sprawdzić.

Dobra praktyka używania map do wstępnego przygotowania danych, ponieważ wielu subskrybentów może uzyskać wyniki. Więc zamiast dodawać preprocessing do każdego klienta (subskrybenta), możesz przygotować pojedyncze wyjście z pojedynczym schematem danych dla wszystkich.

13

Pomyśl o mapie jako middleware, która przekształca odpowiedź.

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) 

subscribe służy do wywoływania obserwowalny, proszę przeczytać dobrą doc na cold-vs-hot-observables

+0

dzięki za pomoc –