Đăng ký không được dùng nữa: Sử dụng trình quan sát thay vì gọi lại lỗi


95

Khi tôi chạy linter nó nói:

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

Mã (từ một ứng dụng góc 7 với góc-cli):

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

Không biết chính xác những gì tôi nên sử dụng và làm thế nào ...

Cảm ơn!


1
* vậy hãy thử sử dụng.subscribe({ next: this.handleUpdateResponse.bind(this), error: this.handleError.bind(this) })
kos

Tôi không quản lý để làm cho nó hoạt động bằng cách sử dụng apiRest của mình
Javier

Câu trả lời:


136

subscribekhông bị phản đối, chỉ biến thể bạn đang sử dụng không được dùng nữa. Trong tương lai, subscribesẽ chỉ nhận một đối số: nexttrình xử lý (một hàm) hoặc đối tượng quan sát.

Vì vậy, trong trường hợp của bạn, bạn nên sử dụng:

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

Xem các sự cố GitHub sau:


6
idk ... di chuột vào so với mã vẫn hiển thị không được chấp nhận với cú pháp đó (rxjs 6.5.3)
Yannic Hamann

6
Xin chào @YannicHamann nhận xét này giải thích tại sao. Nó không bị phản đối, họ chỉ không dùng nữa một trong những quá tải và bây giờ có vẻ như mọi thứ đều không được dùng nữa. Đó là một vấn đề chủ yếu về công cụ.
Dean

Tôi nghĩ rằng câu trả lời này không còn hợp lệ nữa vì tất cả các phương thức đăng ký hiện không được chấp nhận trong rxjs 6.5.4
Alok Rajasukumaran

39

Có thể thú vị khi lưu ý rằng observerĐối tượng cũng có thể (vẫn) chứa complete()phương thức và các thuộc tính bổ sung khác. Thí dụ:

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

Bằng cách này, việc bỏ qua một số phương pháp sẽ dễ dàng hơn nhiều. Với chữ ký cũ, nó là cần thiết để cung cấp undefinedvà bám vào thứ tự lập luận. Bây giờ nó rõ ràng hơn nhiều khi chẳng hạn chỉ cung cấp một trình xử lý tiếp theo và hoàn chỉnh.


10

Bạn có thể gặp lỗi này nếu bạn có một đối tượng được nhập là Observable<T> | Observable<T2>- trái ngược với Observable<T|T2>.

Ví dụ:

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

Trình biên dịch khôngobsloại Observable<number | string>.

Nó có thể làm bạn ngạc nhiên rằng những điều sau đây sẽ cung cấp cho bạn lỗi Use an observer instead of a complete callbackExpected 2-3 arguments, but got 1.

obs.subscribe(value => {

});

Đó là bởi vì nó có thể là một trong hai kiểu khác nhau và trình biên dịch không đủ thông minh để điều hòa chúng.

Bạn cần thay đổi mã của mình để quay lại Observable<number | string>thay vì Observable<number> | Observable<string>. Sự tinh tế của điều này sẽ khác nhau tùy thuộc vào những gì bạn đang làm.


2

Tôi nhận được cảnh báo vì tôi đã chuyển mục này để đăng ký:

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

Vì nó trả về một giá trị duy nhất nên nó không tương thích với subscribechữ ký hàm của.

Chuyển sang điều này làm cho cảnh báo biến mất (trả về null / void);

myObs.subscribe(() => {
  someFunction();
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.