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


94

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

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({ next: this.handleUpdateResponse.bind(this), error: this.handleError.bind(this) })
kos

Мне не удается заставить его работать с помощью моего apiRest
Хавьер

Ответы:


134

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

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

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

См. Эти проблемы на GitHub:


6
idk ... при наведении
Янник Хаманн

6
Привет, @YannicHamann, этот комментарий объясняет, почему. Это не устарело, они просто отказались от одной из перегрузок, и теперь похоже, что все устарело. В основном это проблема с инструментами.
Дин

Я думаю, что этот ответ больше недействителен, так как все методы подписки устарели в rxjs 6.5.4
Алок Раджасукумаран

39

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

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

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


10

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

Например:

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

Компилятор не делает obsиз типа Observable<number | string>.

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

obs.subscribe(value => {

});

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

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


2

Я получал предупреждение, потому что передавал это для подписки:

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

Поскольку он возвращает единственное значение, он несовместим с subscribeсигнатурой функции.

При переключении на это предупреждение исчезло (возвращается null / void);

myObs.subscribe(() => {
  someFunction();
});
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.