Ada bagian ini di Tour of Heroes di mana mereka membuat parameter hasil opsional, tetapi kemudian mereka menggunakan fungsi RxJS of untuk mengejek jenis hasil dalam pernyataan pengembalian:

private handleError<T> (operation = 'operation', result?: T) {
  return (error: any): Observable<T> => {

    // TODO: send the error to remote logging infrastructure
    console.error(error); // log to console instead

    // TODO: better job of transforming error for user consumption
    this.log(`${operation} failed: ${error.message}`);

    // Let the app keep running by returning an empty result.
    return of(result as T);
  };
}

Sumber: https://angular.io/tutorial/toh-pt6#handleerror

Mengapa ini sesuatu? Jika tidak ada hasil, bukankah ini akan berakhir dengan kesalahan? Mengapa opsional?

0
rayaqin 19 Maret 2020, 22:41

1 menjawab

Jawaban Terbaik

Tidak perlu khawatir tidak memiliki jenis untuk ditetapkan ke T, karena jika Anda tidak meneruskan result ke handleError, T akan menjadi undefined secara default . Tidak terdefinisi selain nilai juga tipenya sendiri.


Hal yang menarik untuk dicatat adalah bahwa handleError tidak benar-benar membuat yang dapat diamati itu sendiri, tetapi mengembalikan fungsi yang akan melakukannya setiap kali Anda memanggilnya.

private handleError<T> (operation = 'operation', result?: T) {

    // This function is returned:
    return (error: any): Observable<T> => {
        log(`${operation} failed: ${error.message}`);
        return of(result as T);
    };
}

Jadi jika kita memanggil handleError dengan operation kita mendapatkan kembali sebuah fungsi yang dapat kita panggil berulang kali dengan kesalahan, dan itu akan menggunakan kembali nama/deskripsi untuk setiap panggilan. Ini hanyalah cara untuk menormalkan penanganan kesalahan dengan fungsi biasa. Sekarang result menjadi opsional mulai lebih masuk akal. Mempertimbangkan:

const handler = this.handleError('Fetching stuff');

const err1 = new Error('something went wrong');
const err2 = new Error('something else went wrong');

handler(err1); // "Fetching stuff failed: something went wrong"
handler(err2); // "Fetching stuff failed: something else went wrong"

Demikian pula kita dapat meneruskan nilai result ke handleError yang akan digunakan kembali untuk semua panggilan ke fungsi yang dikembalikan. Saya pikir ini paling berguna ketika fungsi yang dikembalikan dari handleError digunakan di luar kelas tempat mereka dibuat. Dengan cara itu Anda mengekspos fungsi yang mengembalikan nilai tetap yang dapat diamati yang diketahui oleh kelas, mungkin ke menginformasikan kode panggilan informasi tambahan setelah menangani kesalahan.


Perbarui

Melihat cuplikan berikutnya di tautan yang Anda berikan, kami dapat lihat bagaimana handleError sebenarnya digunakan:

 /** GET heroes from the server */
 getHeroes (): Observable<Hero[]> {
     return this.http.get<Hero[]>(this.heroesUrl)
         .pipe(
             tap(_ => this.log('fetched heroes')),
             catchError(this.handleError<Hero[]>('getHeroes', []))
         );
 }

Ini menunjukkan bahwa itu digunakan sebagai penangan kesalahan untuk permintaan http yang gagal. result adalah larik kosong yang bertindak sebagai nilai default untuk larik pahlawan (Hero[]) yang getHeroes janjikan untuk dikembalikan.

Digunakan dengan cara ini, ini adalah teknik kari yang cocok dengan operator catchError yang dapat diamati. Operator menggunakan kembali pengendali kesalahan yang dikembalikan, dan akan memanggilnya dengan kesalahan apa pun yang mungkin terjadi.

1
Jeffrey Westerkamp 20 Maret 2020, 21:46