为什么这两个代码块的工作方式不同?
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
这两个句法上不等同吗?
答案 0 :(得分:2)
发布在问题被临时删除之前写的答案。
Lodash every
接受2 arguments(实际上有3 of them)。
数组map
回调有3 parameters。
考虑到map
只能使用第一个参数(值)调用every
,every
会使用它没有依赖的参数调用,这会改变其行为。
传统的做法是将现有功能作为回调提供,但要谨慎。只有在确定某个函数只接受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' 每个()功能行为。