将lodash every()函数作为参数传递给Rx.JS map()运算符

时间:2017-08-24 12:56:52

标签: javascript ecmascript-6 rxjs lodash

为什么这两个代码块的工作方式不同?

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 );

输出: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 );

输出:r: false

这两个句法上不等同吗?

2 个答案:

答案 0 :(得分:2)

发布在问题被临时删除之前写的答案。

Lodash every接受2 arguments(实际上有3 of them)。

数组map回调有3 parameters

考虑到map只能使用第一个参数(值)调用everyevery会使用它没有依赖的参数调用,这会改变其行为。

传统的做法是将现有功能作为回调提供,但要谨慎。只有在确定某个函数只接受1个参数或其余部分不会影响结果的情况下才能接受它,例如:

const stringArray = array.map(String);

如果对此有疑问,应该使用包装函数,例如:

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

答案 1 :(得分:0)

我的不好,这些片段并不相同: map()运算符通过 2 参数调用传递的投影仪函数,更改了lodash' 每个()功能行为。