2017-07-28 81 views
1

我有一個函數,如果它存在,我必須包裝另一個函數,否則將它替換。這意味着參數的數量根據情況而變化。如何在Javascript ES6中解鎖/反轉咖喱?

這裏就是我的意思是 -

名單列:

const myColumns = [ 
    {name: 'My Field', formatter: function(row, cell, value, colDef, data){ 
     ... do stuff to value... 
     return value; 
    }, 
    {name: 'My Other Field'} 
] 

一些具有格式化,有些則沒有。這是我的「包裝」的功能部分解決方案:

return myColumns.map(columns => { 
    function wrapFormatting(value){ 
     return `<span class="foobar">${value}</value>` 
    } 
    if(column.formatters) { 
     column.formatters = _.flow(column.formatter, wrapFormatting); 
    } else { 
     column.formatter = (row, cell, value) => value => wrapFormatting; 
    } 
}) 

我天真的期望是,在else塊格式我們「反向咖喱」/uncurry三個參數,它最終會看起來像這樣:

column.formatter = function(row, cell, value){ 
    wrapFormatting(value); 
} 

但eslint告訴我,值是a)已經在上面的範圍內聲明,b)已定義但從未使用過。如果我改變其中一個(所以我有(row, cell, value) => val => wrapFormatting我有他們兩個'定義,但從未使用'。

我覺得我錯過了一個把戲,因爲我不能有(row, cell, value) => value => wrapFormatting(value)因爲這將立即調用功能,當column.formatter被調用時,它將不會被調用。

+1

「*'(row,cell,value)=> value => wrapFormatting(value)'會立即調用函數*」 - 你爲什麼這麼認爲? – Bergi

+0

@Bergi因爲這個位*'wrapFormatting(value)'* – Pureferret

+0

嗯,但是你的'函數(行,單元格,值){...'包含完全相同的位。爲什麼不立即在那裏調用它? – Bergi

回答

2

您正在尋找

column.formatter = (row, cell, value) => wrapFormatting(value); 

不知道爲什麼你以爲你有value爲參數兩次,從不打電話wrapFormatting但回報它

+0

我也沒有,那會不會馬上打電話給wrapFormatting? – Pureferret

+1

@Pureferret不會,它定義了一個函數,如果你對箭頭函數感到不舒服,那麼你最好使用你在問題中提出的等效函數語法 – Bergi