Подписка устарела: используйте обозреватель вместо сообщения об ошибке

Когда я запускаю линтер, он говорит:

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

Код (из приложения Angular 7 с Angular-Cli):

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

Не знаю точно, что я должен использовать и как...

Спасибо!

Ответ 1

subscribe не устарела, только тот вариант, который вы используете, устарел. В будущем subscribe будет принимать только один аргумент: либо next обработчик (функция), либо объект-наблюдатель.

Так что в вашем случае вы должны использовать:

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

Посмотрите эти проблемы GitHub:

Ответ 2

Может быть интересно отметить, что объект observer также может (все еще) содержать метод complete() и другие дополнительные свойства. Пример:

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

Таким образом, гораздо проще опустить определенные методы. Со старой подписью необходимо было предоставить undefined и придерживаться порядка рассуждений. Теперь стало намного понятнее, когда, например, только указывается следующий и полный обработчик.

Ответ 3

Вы можете получить эту ошибку, если у вас есть объект, который может представлять два разных типа Observable<T> | Observable<T2> Observable<T> | Observable<T2>.

Например:

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

Вас может удивить, что следующее приведёт к ошибке. Use an observer instead of a complete callback и Expected 2-3 arguments, but got 1.

obs.subscribe(value => {

});

Это потому, что это может быть один из двух разных типов, а компилятор не достаточно умен, чтобы их согласовать.

Вам нужно изменить свой код, чтобы вернуть Observable<number | string> Observable<number | string> вместо Observable<number> | Observable<string> Observable<number> | Observable<string>. Тонкости этого будут зависеть от того, что вы делаете.