Angular 2 – Devuelve datos directamente de un Observable

He estado golpeando mi cabeza contra este tratando de resolverlo, y ninguna cantidad de documentación que he podido leer me ha dado una respuesta a mi pregunta.

Tengo un servicio que habla directamente a una API y devuelve un evento observable que, en circunstancias normales, me suscribiría y haría lo que quisiera con la información, sin embargo, en un servicio secundario que utiliza las solicitudes del servicio de descanso, necesito ser capaz de devolver valores de la solicitud.

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

En el ejemplo rápido anterior, quiero saber si hay alguna manera de devolver las res de getSomething() dentro de returnSomething() . Si no es posible de esta manera, ¿cuál es la alternativa? Añadiré que el _restService es bastante confiable y realmente no quiero comenzar a jugar con eso.

Como las llamadas http y similares son asincrónicas, obtienes un Observable lugar de un valor síncrono devuelto. Tienes que suscribirte a él, y en la callback allí obtienes los datos. No hay forma de evitar eso.

Una opción sería colocar tu lógica en la llamada de subscribe

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

Pero la forma en que me gusta hacerlo es agregar una callback, para inyectar la lógica desde el exterior (tal vez un componente, tal vez otro servicio):

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

Y en su componente o donde sea:

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

No usé esto yo mismo, pero creo que debería funcionar en teoría (:

 // 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)); } 

Verifique los documentos del sujeto para más información. Puede usar diferentes tipos de temas, por ejemplo, BehaviorSubject tiene una propiedad de value que puede acceder …

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

Aquí está el plunker de trabajo …