2016-08-03 4 views
14

Ich habe eine Funktion, die eine Liste von Objekten erhält und es an eine API POST.Kann nicht Observable von String-Wert (angular2/typescript)

Die Funktion gibt Observable zurück, da, wer immer sie aufruft, erwartet, dass sie basierend auf der API-Antwort einen String zurückbekommt.

Wenn die Antwort gut ist, möchte ich eine bestimmte Zeichenfolge zurückgeben, und wenn es ein Fehler ist, möchte ich eine andere Zeichenfolge senden.

Dies ist meine Funktion, die einen String zurückgibt:

public sendUpdate(updatedList: Cars[]): Observable<string> { 
return this._myService.updateListNewOrder(updatedList) 
    .map(response => "The POST worked successfully") 
    .catch(error => Observable.of("An Error occurred")); 
} 

So, jetzt möchte ich diese Funktion aufzurufen und die Zeichenfolge in meinem component.ts zu erhalten:

messageToDisplay: string; 

    public updateList() { 
     this._myService.sendUpdate(this.listToUpdate).subscribe(
     res => this.messageToDisplay = res, // onNext 
     error => this.messageToDisplay = error // onError 
    ); 
    } 

aber das funktioniert nicht ... Ich bekomme keine Fehler. Es ist nur so, dass das MessageToDisplay undefiniert bleibt.

Hat jemand das Problem?

Danke!

Wenn Sie es benötigen, ist dies updateListNewOrder (...):

public updateListNewOrder(newOrderedList: string[]): Observable<ServerResponse> { 
    let apiURL = "my/api/url"; 
    return this.http.post(apiURL, JSON.stringify(newOrderedList), { headers: this.defaultHeaders() } 
    ); 
    } 
+0

Versuchen Sie, Ihre Observable.of zu Observable.throw zu ändern. Aus den rxjs-Dokumenten: https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/throw.md – ajliptak

Antwort

7

ich Ihre Logik hier mit meinen eigenen Funktionen wiedergegeben und alles hat gut funktioniert. Ihre sendUpdate Methode scheint korrekt zu sein, ebenso wie die subscribe Funktion. Also ist die RxJS-Logik in Ordnung für mich. Das Problem könnte in einem anderen Code-Frieden liegen, der nicht aufgedeckt wird.

Das einzige Problem, das ich herausgefunden habe, war der Typ der updateListNewOrder. Es sollte Observable<Response> anstelle von Observable<ServerResponse> sein, wenn Sie das @angular/http Modul verwenden.