Tengo un método que necesita esperar a que termine un observable. Sé que los observables son excelentes para devolver datos individuales a lo largo del tiempo, pero necesito saber cuándo este observable ha terminado por completo de devolver todos sus datos para poder ejecutar el código de validación en el objeto que ha devuelto.
El método getCustom se suscribe a una ejecución observable en la URL proporcionada que luego devuelve el observable.
No estoy muy seguro de si esta es la mejor manera de abordar esta situación, por lo que agradecería si alguien pudiera darme algún consejo o una dirección para manejar esto.
private validateQuoteRetrievalAnswers(reference: string) { // Get the risk from the server this.riskManager.getRiskFromServer(reference); if (this.riskManager.risk) { // Validate risk that was returned } } getRiskFromServer(quoteReference: string) { this.riskService.getCustom("Url").subscribe => { // need to know when the observable has returned the risk }); }cómo abordaría este desafío:
Consulte su back-end y cuando tengamos lo que necesitamos, envíelo a un Asunto
riskSubject = new Subject<Risk>(); getRiskFromServer(quoteReference: string) { this.riskService.getCustom("Url") .subscribe( data => { this.riskSubject.next(data); }, error => { console.log(error) } }); }y luego suscríbase al asunto y espere hasta que obtenga lo que necesita y comience a validar
private validateQuoteRetrievalAnswers(reference: string) { // Get the risk from the server this.riskManager.getRiskFromServer(reference); // subscribe to subject this.riskManager.riskSubject.subscribe( data => { //do your validation }) }El corazón de un servicio de datos observables es el sujeto RxJs. Los sujetos implementan las interfaces Observer y Observable, lo que significa que podemos usarlos tanto para emitir valores como para registrar suscriptores.
El sujeto no es más que un bus de eventos tradicional, pero mucho más potente ya que proporciona a todos los operadores funcionales de RxJs. Pero en el fondo, simplemente lo usamos para suscribirnos como un observable normal.
fuente: angular-university.io
O puede usar Observable.fromPromise(promise) pero esto hará que las cosas sean un poco más complicadas de entender si es nuevo en ng2