2017-08-24 1 views
1

Pourquoi ces deux blocs de code ne fonctionnent-ils pas de la même façon?Passez la fonction lodash every() comme argument à l'opérateur Rx.JS map()

const a = new Rx.Subject; 
const b = new Rx.Subject; 
a.combineLatest(b).map(merge => _.every(merge)).subscribe(r => console.log("r:", r)); 
a.next(true); 
b.next(true); 

Sorties: r: true

const a = new Rx.Subject; 
const b = new Rx.Subject; 
a.combineLatest(b).map(_.every).subscribe(r => console.log("r:", r)); 
a.next(true); 
b.next(true); 

Sorties: r: false

ne sont pas ces deux syntaxiquement équivalent?

+0

Ressemble à moi, pouvez-vous fournir un exemple débogable? – jontro

+0

@jontro Mon mauvais, ces snippers ne sont pas identiques: l'opérateur map() invoque la fonction projecteur passée avec 2 arguments, ce qui change le comportement de la fonction lodash 'every(). – Slav

Répondre

2

La publication d'une réponse écrite avant la suppression temporaire de la question. Lodash every accepte 2 arguments (en pratique il y a 3 of them).

Array map Le rappel a 3 parameters. Considérant que map devrait appeler every uniquement avec le premier argument (valeur), every est appelé avec des arguments sur lesquels il ne comptait pas, cela change son comportement.

Il est classique de fournir des fonctions existantes en tant que rappels, mais avec prudence. Il est acceptable que quand il est connu pour assurer qu'une fonction accepte seulement 1 argument ou le reste d'entre eux n'affectent pas le résultat, par exemple:

const stringArray = array.map(String); 

En cas de doute à ce sujet, la fonction d'emballage doit être utilisé à la place, par exemple:

// will produce unexpected results because parseInt has 2 params 
// const numberArray = array.map(parseInt); 
const numberArray = array.map(str => parseInt(str)); 
0

Mon mauvais, ces snippers ne sont pas identiques: map() opérateur fonction invoque passé projecteur avec arguments, quels changements lodash » tous les() du comportement de la fonction.