angular - Returnera värden och inte void|värden från catch-metoden


Jag använder en tjänst för att göra alla webbförfrågningar på det här sättet:

@Injectable({
  providedIn: 'root'
})
export class WebService {

  auth_token: string;

  constructor(public config: ConfigService, public http: HttpClient, public router: Router) {
    // load token
    this.auth_token = localStorage.getItem("token") ? localStorage.getItem("token") as string : "";
  }

  public async get<T>(dir: string) {
    return await this.http.get<T>(this.config.config.backend.url + dir, { headers: { 'Authorization': `Bearer ${this.auth_token}`, 'Content-Type': 'charset=UTF-8' } }).toPromise();
  }
}

Sedan, i komponenten, gör jag så här:

constructor(web: WebService) {
   web.get<MyObject[]>("obj").then(values => {
     for(let obj of values) {
        obj.doSomething();
     }
   });
}

Jag vill hantera fel mer globalt, för att slippa duplicera kod. Det är mest för att förhindra felaktig token/utgången token/etc.

Så, jag redigerade min tjänst för att ha något liknande detta:

public async get<T>(dir: string) {
   return await this.http.get<T>(this.config.config.backend.url + dir, { headers: { 'Authorization': `Bearer ${this.auth_token}`, 'Content-Type': 'charset=UTF-8' } }).toPromise().catch(err => {
      // here manage all err status code
   });
}

Men catch-metoden returnerar Promise<void | T> och inte Promise<T>. Så jag får ett fel på then()-metoden eftersom values-variabeln kan vara void. Exakt fel är: Type 'void | MyObject[]' is not assignable to type 'MyObject[]'.

Hur kan jag fixa det?

Svar #1

Returnera ett värde i catch. Det kan till exempel vara en tom array när man hämtar en lista.

.catch(err => {
  // here manage all err status code
  return [];
}

Men du behöver definiera i förväg i det fallet om standardvärdet för Promisen är en tom array, en tom sträng, noll eller vad som helst