2017-08-24 85 views
1

爲什麼這兩個代碼塊不能以類似的方式工作?將lodash every()函數作爲參數傳遞給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); 

輸出: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

看起來和我一樣,你能提供一個可調試的例子嗎? – jontro

+0

@jontro我的不好,這些snippers是不一樣的:map()運算符用2個參數調用傳遞的投影函數,什麼改變了lodash的every()函數行爲。 – Slav

回答

2

發佈在問題被臨時刪除之前寫的答案。 (實際上有3 of them)。

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

我的壞,這些snippers是不相同的:圖()運算符調用通過投影功能與參數,什麼樣的變化lodash」 每()功能的行爲。

相關問題