Berlangganan tidak lagi digunakan: Gunakan pengamat, bukan callback error

94

Saat saya menjalankan linter, tertulis:

subscribe is deprecated: Use an observer instead of an error callback

Kode (dari aplikasi angular 7 dengan angular-cli):

    this.userService.updateUser(data).pipe(
       tap(() => {bla bla bla})
    ).subscribe(
       this.handleUpdateResponse.bind(this),
       this.handleError.bind(this)
    );

Tidak tahu persis apa yang harus saya gunakan dan bagaimana ...

Terima kasih!

ismaestro
sumber
1
* jadi coba gunakan.subscribe({ next: this.handleUpdateResponse.bind(this), error: this.handleError.bind(this) })
kos
Saya tidak berhasil membuatnya bekerja menggunakan apiRest saya
Javier

Jawaban:

134

subscribetidak usang, hanya varian yang Anda gunakan yang tidak digunakan lagi. Di masa depan, subscribehanya akan mengambil satu argumen: baik nexthandler (fungsi) atau objek pengamat.

Jadi dalam kasus Anda, Anda harus menggunakan:

.subscribe({
   next: this.handleUpdateResponse.bind(this),
   error: this.handleError.bind(this)
});

Lihat masalah GitHub ini:

martin
sumber
6
idk ... melayang di kode vs masih menunjukkan usang dengan sintaks itu (rxjs 6.5.3)
Yannic Hamann
6
Hai @YannicHamann , komentar ini menjelaskan alasannya. Ini tidak usang, mereka hanya menghentikan salah satu kelebihan beban dan sekarang sepertinya semuanya sudah usang. Ini sebagian besar masalah perkakas.
Dean
Saya pikir jawaban ini tidak lagi valid karena semua metode berlangganan sudah tidak digunakan lagi sekarang di rxjs 6.5.4
Alok Rajasukumaran
39

Mungkin menarik untuk dicatat bahwa observerObject juga bisa (masih) berisi complete()metode dan properti tambahan lainnya. Contoh:

.subscribe({
    complete: () => { ... }, // completeHandler
    error: () => { ... },    // errorHandler 
    next: () => { ... },     // nextHandler
    someOtherProperty: 42
});

Dengan cara ini, lebih mudah untuk menghilangkan metode tertentu. Dengan tanda tangan lama itu perlu untuk memasok undefineddan berpegang pada urutan argumen. Sekarang jauh lebih jelas ketika misalnya hanya menyediakan penangan berikutnya dan lengkap.

magikMaker
sumber
10

Anda bisa mendapatkan kesalahan ini jika Anda memiliki objek yang diketik sebagai Observable<T> | Observable<T2>- sebagai kebalikan dari Observable<T|T2>.

Sebagai contoh:

    const obs = (new Date().getTime() % 2 == 0) ? of(123) : of('ABC');

Kompilator tidak membuat obstipe Observable<number | string>.

Mungkin mengejutkan Anda bahwa berikut ini akan memberi Anda kesalahan Use an observer instead of a complete callbackdanExpected 2-3 arguments, but got 1.

obs.subscribe(value => {

});

Itu karena ini bisa menjadi salah satu dari dua jenis yang berbeda dan kompilator tidak cukup pintar untuk merekonsiliasi mereka.

Anda perlu mengubah kode Anda untuk mengembalikan, Observable<number | string>bukan Observable<number> | Observable<string>. Seluk-beluknya akan bervariasi tergantung pada apa yang Anda lakukan.

Simon_Weaver
sumber
2

Saya mendapatkan peringatan karena saya melewati ini untuk berlangganan:

myObs.subscribe(() => someFunction());

Karena mengembalikan satu nilai, itu tidak kompatibel dengan subscribetanda tangan fungsi.

Beralih ke ini membuat peringatan pergi (mengembalikan null / void);

myObs.subscribe(() => {
  someFunction();
});
anorganik
sumber