Angolare 2: restituire i dati direttamente da un osservabile

Ho battuto la testa contro questo cercando di capirlo, e nessuna quantità di documentazione che ho potuto leggere mi ha dato una risposta alla mia domanda.

Ho un servizio che parla direttamente a un’API e restituisco un evento osservabile che in circostanze normali mi iscriverei e fare ciò che voglio con i dati, tuttavia in un servizio secondario che utilizza le richieste del servizio restful, ho bisogno di essere in grado di restituire i valori dalla richiesta.

getSomething() { return this._restService.addRequest('object', 'method').run() .subscribe( res => { res; }, err => { console.error(err); } ); } returnSomething() { return this.getSomething(); } 

Nell’esempio rapido sopra, voglio sapere se esiste un modo per restituire res da getSomething() all’interno di returnSomething() . Se non è ansible in questo modo, qual è l’alternativa? Aggiungerò che il _restService è abbastanza pesantemente invocato e non voglio davvero iniziare a scherzare con quello.

Poiché le chiamate HTTP e simili sono asincrone, si ottiene un Observable invece di un valore sincrono restituito. Devi iscriverti ad esso, e nella richiamata in là ottieni i dati. Non c’è modo di aggirare questo.

Un’opzione sarebbe quella di inserire la logica nella chiamata di subscribe

 getSomething() { return this._restService.addRequest('object', 'method').run() .subscribe( res => { // do something here res; }, err => { console.error(err); } ); } 

Ma il modo in cui mi piace farlo è aggiungere un callback, per iniettare la logica dall’esterno (forse un componente, forse un altro servizio):

 getSomething(callback: (data) => void) { return this._restService.addRequest('object', 'method').run() .subscribe( res => { callback(res); }, err => { console.error(err); } ); } 

E nel tuo componente o dovunque:

 this._yourService.getSomething((data) => { // do something here console.log(data); }); 

Non l’ho usato da solo, ma credo che dovrebbe funzionare in teoria (:

 // service.ts getSomething() { let subject: Subject = new Subject(); this._restService.addRequest('object', 'method').run() .subscribe(subject); return subject; } // this can be removed (; returnSomething() { return this.getSomething(); } // component.ts ngOnInit() { this.service.returnSomething() .subscribe(res => console.log(res), err => console.log(err)); } 

Controlla i documenti soggetti per maggiori informazioni. È ansible utilizzare diversi tipi di object, ad esempio BehaviorSubject ha proprietà value è ansible accedere …

 ngOnInit() { // if you use BehaviorSubject this.service.returnSomething().value } 

Ecco il plunker funzionante …