【问题标题】:Pass lodash every() function as an argument to Rx.JS map() operator将 lodash every() 函数作为参数传递给 Rx.JS map() 运算符
【发布时间】:2017-08-24 12:56:52
【问题描述】:

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

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

这两个在语法上不是等价的吗?

【问题讨论】:

  • 看起来和我一模一样,你能提供一个可调试的例子吗?
  • @jontro 我的错,这些狙击手并不相同:map() 运算符使用 2 个参数调用传递的投影仪函数,这会改变 lodash 的 every() 函数行为。

标签: javascript ecmascript-6 rxjs lodash


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我的错,这些snipers 并不完全相同:ma​​p() 操作符使用 2 参数调用传递的投影仪函数,改变了 lodash' every() 函数行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 2011-09-27
      相关资源
      最近更新 更多