2017-10-25 5 views
1

Was ich versuche zu erreichen, wenn ich den Statuscode 401 Unauthorized bekomme, einen Dialog erstelle und nach Klick auf "OK" zur Login-Seite navigiere.Forcing Observable Warten, bis die Callback-Funktion aufgerufen wird

Ich werde es im Detail erklären, aber im Allgemeinen mein Problem ist, ich kann nicht die beobachtbare this.getDialogModalService() machen. DisplayDialogModal() Warten auf die Callback-Funktion von ModalController „onDidDismiss“ aufgerufen werden. Und kehrt sofort undefiniert zum Aufruferdienst this.http.post() zurück.

Gibt es eine Möglichkeit, das Observable warten zu lassen, bis der Callback aufgerufen wird? Oder vielleicht ist die gesamte Struktur unnötig verschachtelt und sollte geändert werden.

Ich möchte nicht mehr Informationen geben und die Dinge noch mehr komplizieren, aber wenn nötig, kann ich mehr Informationen für die unklaren Teile geben.

Hier ist ein kleiner Aufruf-Stack;

=> abonnierten =>geteventlist() =>this.http.post() =>this.getDialogModalService(). DisplayDialogModal() => Rückruf =>dialogModal.onDidDismiss()

Event.Component.ts

public getEventList() { 
    return this.eventService.getEventList(this.navParams.data).subscribe((x: Array<HomeEventListViewModel>) => { 
     this._eventList.next(x); 
    }, error => { 
    }); 
} 

EventService.ts Ich nenne hier this.http.post

public getEventList(eventType: number): Observable<Array<HomeEventListViewModel>> { 
     var model = new EventListType(eventType); 
     return this.http.post('/api/Event/EventList', JSON.stringify(model), null).map((res: Response) => { 
      if (res) { 
      let httpResponse: HttpResponseSuccessModel = res.json(); 
      return httpResponse.content; 
      }    
     }, error => { 
      return null; 
     }).catch(x => { 
      return null; 
     }); 
} 

HttpInterceptor.ts

Ich schicke hier die HTTP-Anfrage mit meinem abgefangen http Dienst und 401 Aufruf modal Service fangen den Dialog

post(url: string, body: string, options?: RequestOptionsArgs): Observable<Response> { 
    url = this.updateUrl(url); 
    return super.post(url, body, this.getRequestOptionArgs(options)).map((res: Response) => { 
     return res; 
    }, error => { 
     this.getDialogModalService().displayDialogModal("UNKNOWN_ERROR_TITLE", "UNKNOWN_ERROR_MESSAGE");    
     return null; 
    }).catch(error => { 
     let errorResponse: any = JSON.parse(error._body); 
     return this.getDialogModalService().displayDialogModal(errorResponse.errorMessage, "ERROR").map(x => { 

      return error;    
     }); 
    }); 
} 
anzuzeigen

ModalDialog.Service.ts

Dies ist der modale Dienst, den ich für alle meine Anzeige-Dialog-Ereignisse verwende. Und meiner Meinung nach beginnt das Problem. Es wartet nicht auf den Rückruf, bis es aufgerufen wird, aber sofort undefined zurückgibt.

displayDialogModal(infoMessage: string, infoTitle: string = "INFO"): Observable<any> { 
    return this.translateService.get(infoTitle).map(title => { 
     let messageType: number = infoTitle == "INFO" ? 1 : 2; 
     let dialogModal = this.dialogModalPresent(infoMessage, title, messageType); 

     return dialogModal.onDidDismiss(data => { 
      return data; 
     }); 
    });   
} 


// messageType = 1:Info, 2:Error 
private dialogModalPresent(infoMessage: string, infoTitle: string, messageType: number): Modal { 
    let cssClass: string = messageType == 1 ? "gift-modal gift-modal-info" : "gift-modal gift-modal-error"; 
    let dialogModal = this.modalCtrl.create(DialogComponent, 
    { "infoMessage": infoMessage, "infoTitle": infoTitle, "firstButtonText": "OK"}, 
    { showBackdrop: true, enableBackdropDismiss: false, cssClass: cssClass }); 

    dialogModal.present(); 

    return dialogModal; 
} 

Antwort

1

Ich gebe zu, ich habe Probleme das ganze Bild zu sehen, aber eine Sache der Anmerkung - wenn Sie Angular 4.3.4 verwenden und die HttpInterceptor Schnittstelle dann http.post in EventService.ts wahrscheinlich HttpClient.post sein sollte.

Hoffe, das hilft.

Verwandte Themen