2017-07-25 3 views
1

Was ist ein Missverständnis darüber, wie die .subscribe-Funktion in Verbindung mit der .do-Funktion verwendet wird?Eigenschaft 'do' existiert nicht für den Typ 'Subskription'

Hier ist meine beobachtbaren Folge:

lookupSubscriber = (text$: Observable<string>) => 

    text$.debounceTime(300) 
    .distinctUntilChanged() 
    .do(() => this.searching = true) 
    .switchMap(term => { 
     var data = this._callApi(this.lookupSubscriberAPI, term) 
      .do(() => { 
       this.searchFailed = false; 
       this.searching = false; 
      }) 
      .catch(() => { 
       this.searchFailed = true; 
       this.searching = false; 
       return Observable.of([]); 
      }) 
     return data; 
    }) 
    .do(() => this.searching = false); 

Wenn meine _callApi Funktion wie folgt ist, funktioniert es:

_callApi(url: string, term: string) { 
    if (term === '') { 
    return of.call([]); 
    } 

    return map.call(this.dataService.get(url + term), response => { 
    var data = this._transformSubscriberInfo(response); 
    return data; 
    }) 

}

Allerdings, wenn ich versuche, es mit einem neu zu schreiben subscribe Funktion wie folgt:

_callApi = (url: string, term: string) => { 

    return this.dataService.get(url + term) 
     .subscribe(
      response => { this._transformSubscriberInfo(response) }, 
      error => error.text(), 
      () => { 
       if (Logging.isEnabled.light) { 
       console.log('%c API Call Complete', Logging.normal.orange); 
       } 
     )) 
} 

... dann gelingt sich der Datenanruf, aber ich erhalte Fehler: Property 'do' does not exist on type 'Subscription'.

Grundsätzlich versuche ich, Fehler zu fangen und eine „immer“ Funktion nach dem API-Aufruf ausführen, wie in der zweiten Version von _callApi gezeigt.

Antwort

4

Die erste Version von _callApi scheint eine Observable zurückzugeben, während die zweite ein Subscription Objekt zurückgibt. Und Subscription stellt do nicht genau aus, wie die Fehlermeldung angibt.

Was können Sie versuchen wollen, ist eine Version von do zu verwenden, die error und complete Rückrufe neben dem next Rückruf akzeptiert:

return this.dataService.get(url + term) 
    .map(response => this._transformSubscriberInfo(response)) 
    .do(
     response => { /* log response */ }, 
     error => { /* log error */ }, 
     () => { /* log completion */ } 
    ); 

Es erwähnenswert, dass do nicht in der Lage ist, die Quelle Strom umzuwandeln , das Observable, das es zurückgibt, enthält dieselben Werte wie das Observable, an dem es aufgerufen wird. Deshalb brauchen wir die Linie .map(response => this._transformSubscriberInfo(response)). Der Callback sollte nicht für eine "always" -Funktion verwechselt werden: er wird nur aufgerufen, wenn die Quelle beobachtbar ist und nicht aufgerufen wird, wenn die Observable einen Fehler erzeugt oder abbestellt wird.

Verwandte Themen