Necesito llamar a una API que pueda devolver errores, advertencias o éxito.
Si devuelve advertencias, el usuario debe poder aceptar la advertencia y debo enviar la misma carga útil + acceptWarning: verdadero.
Necesito mostrar un modal iónico y esperar la respuesta del usuario para ver si acepta o cancela la advertencia.
¿Cuál debería ser la mejor manera de lograrlo?
Ahora mismo tengo algo como esto:
@Effect() public Assign$ = this.actions$.pipe( ofType(myActions.Assign), map(action => action.payload), exhaustMap(assignment => this.assignService.assign(assignment).pipe( switchMap(() => { this.errorService.showPositiveToast(' Assigned Successfully'); return [ new LoadAssignments(), new LoadOtherData() ]; }), catchError(error => from(this.openErrorModal(error)).pipe( switchMap(({ data = '' }) => { if (data === 'Accept') { return of(new Assign({ ...assignment, acceptWarning: true })); } return of(new AssignShipmentFailure()); }) ) ) ) ) ); async openErrorModal(response: any) { const errorModal = await this.modalCtrl.create({ component: ErrorValidationPopup, componentProps: { response: response, }, }); await errorModal.present(); return errorModal.onDidDismiss(); }Pero no vuelve a activar la acción Asignar. Gracias por tu ayuda
Si ocurría algún error en el Observable del efecto (o en cualquier Observable ), entonces su flujo no emitía ningún valor y se erró inmediatamente. Después del error, no se completó y el Effect dejará de funcionar.
Para mantener el Effect funcionando si se produce algún error, debe swichMap en lugar de exhaustMap y manejar los errores dentro del observable interno de switchMap , por lo que el Observable principal no se verá afectado por eso.
La principal diferencia entre switchMap y otros operadores de aplanamiento es el efecto de cancelación. En cada emisión, el observable interno anterior (el resultado de la función que proporcionó) se cancela y se suscribe el nuevo observable. Puedes recordar esto por la frase cambiar a un nuevo observable
Puedes intentar algo como lo siguiente:
@Effect() public Assign$ = this.actions$.pipe( ofType(myActions.Assign), map(action => action.payload), switchMap(assignment => this.assignService.assign(assignment).pipe( switchMap(() => { this.errorService.showPositiveToast('Assigned Successfully'); return [ new LoadAssignments(), new LoadOtherData() ]; }), catchError(error => from(this.openErrorModal(error)).pipe( map(({ data = '' }) => { if (data === 'Accept') { return new Assign({ ...assignment, acceptWarning: true }); } return new AssignShipmentFailure(); }) ) ) ) ) );