70 votes

Différence entre les méthodes .pipe() et .subscribe() sur un observable RXJS

J'ai récemment remarqué que je peux renvoyer une valeur à l'intérieur de .pipe() mais pas à l'intérieur .subscribe() .

Quelle est la différence entre ces deux méthodes ?

Par exemple, si j'ai cette fonction, appelons-la "dépôt", qui est censée renvoyer le solde du compte, si je fais ceci.. :

deposit(account, amount){
    return this.http.get('url')
    .subscribe(res => {
        return res;
    }
}

Il retourne un observable et si je fais ça :

deposit(account, amount){
    return this.http.get('url')
    .pipe(
        map(res => {
            return res;
        });
    );
}

Il renvoie le solde du compte comme prévu.

Alors pourquoi ?

73voto

Mathew Foscarini Points 6076

Le site pipe sert à enchaîner les opérateurs observables, et la méthode subscribe sert à activer l'observable et à écouter les valeurs émises.

Le site pipe a été ajoutée pour permettre aux webpack pour supprimer les opérateurs inutilisés du paquet final de JavaScript. Cela permet de construire plus facilement des fichiers plus petits.

Par exemple, si j'ai cette fonction, appelons-la 'dépôt', qui est censée renvoyer le solde du compte, si je fais ceci :

deposit(account, amount){
    return this.http.get('url')
    .subscribe(res => {
        return res;
    }
}

Elle renvoie une observable

Ce n'est pas ce qu'elle renvoie. Elle renvoie le Subscription créé lorsque vous avez appelé Subscribe .

et si je fais ça :

deposit(account, amount){
    return this.http.get('url')
    .pipe(
        map(res => {
            return res;
        });
    );
}

Il renvoie le solde du compte comme prévu.

Ce n'est pas ce qu'elle renvoie. Elle renvoie un Observable qui utilise un map opérateur. L'opérateur map dans votre exemple ne fait rien.

4 votes

Cette réponse est maintenant incomplète. Il semble manquer des captures d'écran ou des extraits de code.

3 votes

Je pense qu'il fait référence aux extraits de code du PO, plutôt que de les dupliquer dans la réponse. Cela m'a également surpris.

2 votes

J'ai modifié la réponse pour inclure les extraits de code du PO afin d'améliorer la lisibilité, merci à @ShafiqJetha d'avoir indiqué ce qui manquait.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X