web-dev-qa-db-fra.com

RxJs Observable de vs de

La seule différence entre Observable.of et Observable.from est-elle le format des arguments? Comme le Function.prototype.call et Function.prototype.apply?

Observable.of(1,2,3).subscribe(() => {})
Observable.from([1,2,3]).subscribe(() => {})
115
xiaoke

Pas assez. Lors du passage d'un tableau à Observable.from, la seule différence entre lui et Observable.of réside dans le mode de transmission des arguments.

Cependant, Observable.from acceptera un argument qui est

un objet abonné, une promesse, un objet de type observable, un tableau, un objet itérable ou de type tableau à convertir

Il n'y a pas de comportement similaire pour Observable.of - qui accepte toujours uniquement les valeurs et n'effectue aucune conversion.

76
cartant

Il est important de noter la différence entre of et from lors du passage d'une structure de type tableau (y compris les chaînes):

Observable.of([1, 2, 3]).subscribe(x => console.log(x));

serait imprimer tout le tableau à la fois.

D'autre part,

Observable.from([1, 2, 3]).subscribe(x => console.log(x));

imprime les éléments 1 par 1.

Pour les chaînes, le comportement est le même, mais au niveau du personnage.

141
Tsvetan Ovedenski

Observable est un autre fait intéressant. Of ([]) sera un tableau vide lorsque vous vous y abonnerez. Où que lorsque vous vous abonnez à Observable.from ([]), vous n'obtiendrez aucune valeur.

Ceci est important lorsque vous effectuez une sauvegarde consécutive avec switchmap. Ex:

.do((data) => {
            this.jobService.save$.next(this.job.id);
        })
        .switchMap(() => this.jobService.addSites(this.job.id, this.sites)
            .flatMap((data) => {
                if (data.length > 0) {
                    // get observables for saving
                    return Observable.forkJoin(jobSiteObservables);
                } else {
                    **return Observable.of([]);**
                }
            })).do((result) => {
            // ..
        })
        .switchMap(() => this.saveComments())
....

si data.length = 0 dans la section addSite, le code ci-dessus renvoie Observable.of ([]), puis enregistre les commentaires. Mais si vous le remplacez par Observable.from ([]), les méthodes suivantes ne seront pas appelées.

rxfiddle

9
Josf