Підписка застаріла: використовуйте спостерігача замість зворотного виклику помилки


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 ... зависання в коді проти все ще відображається застарілим із цим синтаксисом (rxjs 6.5.3)
Яннік Гаманн

6
Привіт @YannicHamann Цей коментар пояснює, чому. Це не застаріло, вони просто припинили одне із перевантажень, і тепер схоже, що все застаріло. В основному це питання інструментарію.
Дін

Я думаю, що ця відповідь вже недійсна, оскільки всі методи підписки застаріли в rxjs 6.5.4
Alok Rajasukumaran

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.