Tengo una función como esta;
openModalWhenRemoveItem() { callRemoveService(); openMyModal(); } La función callRemoveService() tiene una función de suscripción y asíncrona, la función openMyModal() debe invocarse después de callRemoteService()
callRemoveService() { combineLatest(myAccountSelector$, myCompanySelector$).pipe( switchMap(res) => this.myService.remove(res[0].id, res[1].id)) .subscribe((res)=> console.log(res)) } Necesito crear una función que tenga que esperar la suscripción interna en callRemoveService() antes de llamar a openModal() . Quiero probar con async await pero no puedo encontrar una solución. Probé de esta manera:
async callRemoveService() { await combineLatest(myAccountSelector$, myCompanySelector$).pipe( switchMap(res) => this.myService.remove(res[0].id, res[1].id)) .subscribe((res)=> console.log(res)) } openModalWhenRemoveItem() { callRemoveService().then(() => {openMyModal();}); } pero no funciona No puedo poner la función openMyModal() en suscripción.
La solución en su caso sería devolver el Observable desde el método callRemoveService en lugar de suscribirse a él. La advertencia con este enfoque es que debe llamar a subscribe en todos los lugares donde llama a callRemoveService .
Si haces eso, entonces es trivial:
callRemoveService(): Observable<any> { return combineLatest(myAccountSelector$, myCompanySelector$).pipe( switchMap(res) => this.myService.remove(res[0].id, res[1].id)); } Entonces su método openModalWhenRemoveItem se convierte en esto:
openModalWhenRemoveItem() { callRemoveService().subscribe(() => { openMyModal(); }; }combineLatest es un operador RxJS, devuelve un Observable. No puedes simplemente esperar un Observable, no es una Promesa. Simplemente suscríbase a él.
callRemoveService(): Observable<any> { return combineLatest(myAccountSelector$, myCompanySelector$); }y entonces :
openModalWhenRemoveItem() { callRemoveService().subscribe(openMyModal); } Alternativamente, puede transformar su Observable en Promise usando el operador lastValueFrom y esperarlo:
callRemoveService(): Promise<any> { return lastValueFrom( combineLatest(myAccountSelector$, myCompanySelector$)) ; } async openModalWhenRemoveItem() { await callRemoveService(); openMyModal(); }