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!


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:


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.


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.


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();
});
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.