L'abonnement est obsolète: utilisez un observateur au lieu d'un rappel d'erreur

94

Quand je lance le linter, il dit:

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

Code (à partir d'une application angular 7 avec angular-cli):

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

Je ne sais pas exactement ce que je dois utiliser et comment ...

Merci!

ismaestro
la source
1
* alors essayez d'utiliser.subscribe({ next: this.handleUpdateResponse.bind(this), error: this.handleError.bind(this) })
kos
Je n'arrive pas à le faire fonctionner en utilisant mon apiRest
Javier

Réponses:

134

subscriben'est pas obsolète, seule la variante que vous utilisez est obsolète. À l'avenir, subscribene prendra qu'un seul argument: soit le nextgestionnaire (une fonction), soit un objet observateur.

Donc, dans votre cas, vous devriez utiliser:

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

Consultez ces problèmes GitHub:

Martin
la source
6
idk ... le survol du code vs montre toujours obsolète avec cette syntaxe (rxjs 6.5.3)
Yannic Hamann
6
Hey @YannicHamann, ce commentaire explique pourquoi. Ce n'est pas obsolète, ils ont simplement abandonné l'une des surcharges et maintenant il semble que tout soit obsolète. C'est surtout un problème d'outillage.
Dean le
Je pense que cette réponse n'est plus valide puisque toutes les méthodes d'abonnement sont maintenant obsolètes dans rxjs 6.5.4
Alok Rajasukumaran
39

Peut-être intéressant de noter que l' observerobjet peut également (encore) contenir la complete()méthode et d'autres propriétés supplémentaires. Exemple:

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

De cette façon, il est beaucoup plus facile d'omettre certaines méthodes. Avec l'ancienne signature, il était nécessaire de fournir undefinedet de respecter l'ordre des arguments. Maintenant, c'est beaucoup plus clair lorsque, par exemple, ne fournissez qu'un gestionnaire suivant et complet.

magikMaker
la source
10

Vous pouvez obtenir cette erreur si vous avez un objet tapé comme Observable<T> | Observable<T2>- par opposition à Observable<T|T2>.

Par exemple:

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

Le compilateur ne pas faire obsde type Observable<number | string>.

Cela peut vous surprendre que ce qui suit vous donne l'erreur Use an observer instead of a complete callbacketExpected 2-3 arguments, but got 1.

obs.subscribe(value => {

});

C'est parce qu'il peut s'agir de l'un des deux types différents et que le compilateur n'est pas assez intelligent pour les réconcilier.

Vous devez changer votre code pour retourner Observable<number | string>au lieu de Observable<number> | Observable<string>. Les subtilités de cela varieront en fonction de ce que vous faites.

Simon_Weaver
la source
2

Je recevais l'avertissement parce que je transmettais ceci pour m'abonner:

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

Puisqu'il renvoie une seule valeur, il était incompatible avec subscribela signature de fonction de.

Le passage à ceci a fait disparaître l'avertissement (retourne nul / non avenu);

myObs.subscribe(() => {
  someFunction();
});
inorganik
la source