2017-05-23 5 views
0

Mit Angular 2 habe ich einen Dienst, der meine API-Aufrufe verarbeitet. Im Dienst habe ich eine HandleError-Funktion, die eine Promise<string> für die Fehlermeldung zurückgibt. Ich versuche, dem handleError einige Funktionen hinzuzufügen, die die Seite anschließend zum Anmeldebildschirm umleiten, wenn Anmeldefehler vorliegen. Wenn ich das tue, löst TypeScript einen TS2322-Fehler aus, obwohl ich dasselbe Versprechen zurückgebe und dann versuche, einige Ketten daraus zu machen.angular2 TS2322 Typ 'Promise <void>' kann nicht dem Typ 'Promise <string>' zugeordnet werden, wenn eine Zeichenfolge angegeben wird

Fehler TS2322: Typ 'Versprechen <Leere>' ist nicht belegbar 'Versprechen <Zeichenfolge>' eingeben. Type 'void' ist nicht dem Typ 'string' zuweisbar.

private handleError(error: Error): Promise<string> { 
    let message = "Something went wrong loading data from the API."; 
    if (error.response.status === 0) { 
     message = "Unable to contact server. Please file a bug report."; 
    } 
    if (error.message) { 
     message = "API Service Error retrieving page: " + error.message; 
    } 
    this.alerts.error(message); 
    if (error.response.status === 403) { 
     if (error.message.indexOf("Authentication credentials") !== -1) { 
      return Promise.reject<string>(message) // this line errs with TS2322 
      .then(() => this.appState.refresh()) 
      .then(() => this.redirects.login()) 
      .then(() => this.alerts.warning("Redirected to login because no credentials found.")); 
     } else { 
      this.redirects.index(); 
     } 
    } 
    return Promise.reject<string>(message); 
} 
+3

Keiner Ihrer 'then() 'Callbacks wird jemals ausgeführt, weil Ihr Versprechen abgelehnt wird. – SLaks

Antwort

1
 return Promise.reject<string>(message) // this line errs with TS2322 
     .then(() => this.appState.refresh()) 
     .then(() => this.redirects.login()) 
     .then(() => this.alerts.warning("Redirected to login because no credentials found.")); 

Typoskript an Sie schreien, weil appState.refresh, redirects.login oder alerts.warning eine Lücke Wert zurückgibt. Zur Kette legen Sie es richtig, eine Variable mit den Ketten, dann die Variable zurück:

let result = Promise.reject<string>(message); 

     result.then(() => this.appState.refresh()) 
      .then(() => this.redirects.login()) 
      .then(() => this.alerts.warning("Redirected to login because no credentials found.")); 

    return result; 

Es ist erwähnenswert, dass keiner der then s aufgerufen werden, weil Ihr Versprechen abgelehnt.

+0

Wie zeige ich an, dass ein Fehler vorliegt (Promise.reject()) und dann andere Aktionen passieren? –

+1

Sie könnten das erste 'then' in ein' catch' ändern, oder Sie könnten 'this.appState.refresh()' direkt danach mit der Kette aufrufen, da sie keinen Wert aus dem ursprünglichen 'Promise.reject benötigen '. – joh04667

Verwandte Themen