Abonnieren ist veraltet: Verwenden Sie einen Beobachter anstelle eines Fehlerrückrufs

94

Wenn ich den Linter laufen lasse, heißt es:

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

Code (aus einer Angular 7 App mit Angular-Cli):

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

Ich weiß nicht genau, was ich verwenden soll und wie ...

Vielen Dank!

ismaestro
quelle
1
* .subscribe({ next: this.handleUpdateResponse.bind(this), error: this.handleError.bind(this) })
Also
Ich schaffe es nicht, es mit meinem apiRest zum Laufen zu bringen
Javier

Antworten:

134

subscribeist nicht veraltet, nur die von Ihnen verwendete Variante ist veraltet. In Zukunft subscribewird nur ein Argument verwendet: entweder der nextHandler (eine Funktion) oder ein Beobachterobjekt.

In Ihrem Fall sollten Sie also Folgendes verwenden:

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

Siehe diese GitHub-Probleme:

Martin
quelle
6
idk ... schwebt in vs Code zeigt immer noch veraltet mit dieser Syntax (rxjs 6.5.3)
Yannic Hamann
6
Hey @YannicHamann dieser Kommentar erklärt warum. Es ist nicht veraltet, sie haben nur eine der Überladungen veraltet und jetzt sieht es so aus, als wäre alles veraltet. Es ist meistens ein Werkzeugproblem.
Dean
Ich denke, diese Antwort ist nicht mehr gültig, da alle Abonnementmethoden in rxjs 6.5.4
Alok Rajasukumaran
39

Vielleicht interessant zu bemerken, dass das observerObjekt auch (noch) die complete()Methode und andere zusätzliche Eigenschaften enthalten kann. Beispiel:

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

Auf diese Weise ist es viel einfacher, bestimmte Methoden wegzulassen. Bei der alten Unterschrift war es notwendig undefined, die Reihenfolge der Argumente anzugeben und einzuhalten. Jetzt ist es viel klarer, wenn zum Beispiel nur ein nächster und vollständiger Handler bereitgestellt wird.

magikMaker
quelle
10

Sie können diesen Fehler erhalten, wenn Sie ein Objekt eingegeben haben als Observable<T> | Observable<T2>- im Gegensatz zu Observable<T|T2>.

Zum Beispiel:

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

Der Compiler ist nicht machen obsvom Typ Observable<number | string>.

Es kann Sie überraschen, dass das Folgende Ihnen den Fehler Use an observer instead of a complete callbackund gibtExpected 2-3 arguments, but got 1.

obs.subscribe(value => {

});

Dies liegt daran, dass es sich um einen von zwei verschiedenen Typen handeln kann und der Compiler nicht intelligent genug ist, um sie miteinander in Einklang zu bringen.

Sie müssen Ihren Code ändern, um Observable<number | string>statt zurückzukehren Observable<number> | Observable<string>. Die Feinheiten davon hängen davon ab, was Sie tun.

Simon_Weaver
quelle
2

Ich erhielt die Warnung, weil ich diese zum Abonnieren weitergab:

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

Da es einen einzelnen Wert zurückgibt, war es nicht mit subscribeder Funktionssignatur kompatibel .

Wenn Sie darauf umschalten, wird die Warnung ausgeblendet (gibt null / void zurück).

myObs.subscribe(() => {
  someFunction();
});
anorganik
quelle