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!
.subscribe({ next: this.handleUpdateResponse.bind(this), error: this.handleError.bind(this) })
Odpowiedzi:
subscribe
nie jest przestarzała, tylko wariant, którego używasz, jest przestarzały. W przyszłościsubscribe
będzie przyjmować tylko jeden argument: albo funkcjęnext
obsługi (funkcję), albo obiekt obserwatora.Więc w twoim przypadku powinieneś użyć:
Zobacz te problemy z GitHub:
https://github.com/ReactiveX/rxjs/pull/4202
https://github.com/ReactiveX/rxjs/issues/4159
źródło
Może warto zauważyć, że
observer
Object może również (nadal) zawieraćcomplete()
metodę i inne, dodatkowe właściwości. Przykład:W ten sposób znacznie łatwiej jest pominąć pewne metody. Przy starym podpisie trzeba było podać
undefined
i trzymać się kolejności argumentów. Teraz jest znacznie jaśniej, gdy na przykład dostarcza się tylko następnego i kompletnego handlera.źródło
Możesz otrzymać ten błąd, jeśli masz obiekt wpisany jako
Observable<T> | Observable<T2>
- w przeciwieństwie doObservable<T|T2>
.Na przykład:
Kompilator nie tworzy
obs
typuObservable<number | string>
.Może cię zdziwić, że poniżej wystąpi błąd
Use an observer instead of a complete callback
iExpected 2-3 arguments, but got 1.
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>
zamiastObservable<number> | Observable<string>
. Subtelności tego będą się różnić w zależności od tego, co robisz.źródło
Otrzymałem ostrzeżenie, ponieważ przekazywałem to, aby subskrybować:
Ponieważ zwraca pojedynczą wartość, jest niezgodny z
subscribe
sygnaturą funkcji.Przełączenie na to sprawiło, że ostrzeżenie zniknęło (zwraca wartość null / void);
źródło