Подписка устарела: используйте обозреватель вместо сообщения об ошибке
Когда я запускаю линтер, он говорит:
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>
. Тонкости этого будут зависеть от того, что вы делаете.