Subskrypcja jest przestarzała: użyj obserwatora zamiast wywołania zwrotnego błędu

103

Kiedy uruchamiam linter, mówi:

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

Kod (z aplikacji angular 7 z angular-cli):

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

Nie wiem dokładnie, czego mam używać i jak ...

Dzięki!

ismaestro
źródło
1
* więc spróbuj użyć.subscribe({ next: this.handleUpdateResponse.bind(this), error: this.handleError.bind(this) })
kos
Nie udaje mi się to zrobić przy użyciu mojego apiRest
Javier

Odpowiedzi:

144

subscribenie jest przestarzała, tylko wariant, którego używasz, jest przestarzały. W przyszłości subscribebędzie przyjmować tylko jeden argument: albo funkcję nextobsługi (funkcję), albo obiekt obserwatora.

Więc w twoim przypadku powinieneś użyć:

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

Zobacz te problemy z GitHub:

jaskółka oknówka
źródło
6
idk ... najechanie kursorem na kod vs nadal pokazuje przestarzałe z tą składnią (rxjs 6.5.3)
Yannic Hamann
7
Hej @YannicHamann, ten komentarz wyjaśnia dlaczego. Nie jest przestarzały, po prostu wycofali jedno z przeciążeń, a teraz wygląda na to, że wszystko jest przestarzałe. Jest to głównie problem z narzędziami.
Dean
Myślę, że ta odpowiedź nie jest już ważna, ponieważ wszystkie metody subskrypcji są teraz przestarzałe w rxjs 6.5.4
Alok Rajasukumaran
44

Może warto zauważyć, że observerObject może również (nadal) zawierać complete()metodę i inne, dodatkowe właściwości. Przykład:

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

W ten sposób znacznie łatwiej jest pominąć pewne metody. Przy starym podpisie trzeba było podać undefinedi trzymać się kolejności argumentów. Teraz jest znacznie jaśniej, gdy na przykład dostarcza się tylko następnego i kompletnego handlera.

magikMaker
źródło
11

Możesz otrzymać ten błąd, jeśli masz obiekt wpisany jako Observable<T> | Observable<T2>- w przeciwieństwie do Observable<T|T2>.

Na przykład:

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

Kompilator nie tworzy obstypu Observable<number | string>.

Może cię zdziwić, że poniżej wystąpi błąd Use an observer instead of a complete callbackiExpected 2-3 arguments, but got 1.

obs.subscribe(value => {

});

Dzieje się tak, ponieważ może to być jeden z dwóch różnych typów, a kompilator nie jest wystarczająco inteligentny, aby je pogodzić.

Musisz zmienić kod, aby zwracał Observable<number | string>zamiast Observable<number> | Observable<string>. Subtelności tego będą się różnić w zależności od tego, co robisz.

Simon_Weaver
źródło
2

Otrzymałem ostrzeżenie, ponieważ przekazywałem to, aby subskrybować:

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

Ponieważ zwraca pojedynczą wartość, jest niezgodny z subscribesygnaturą funkcji.

Przełączenie na to sprawiło, że ostrzeżenie zniknęło (zwraca wartość null / void);

myObs.subscribe(() => {
  someFunction();
});
nieorganik
źródło