2016-01-27 17 views
1

我使用的地圖,像這樣的一組函數映射:添加新的第一個參數,然後將原來的參數

function runWaterfall(consumer, fns, cb) { 

    fns = fns.map(function (fn) { 
     return function() { 
      fn(consumer, arguments); 
     } 
    }); 

    async.waterfall(fns, cb); 

} 

所以你可以看到,我想「消費」加爲第一個參數對每個函數fn,但我不相信我的語法是正確的。

也許這是更好的:

function runWaterfall(consumer, fns, cb) { 

    fns = fns.map(function (fn) { 
     return function() { 
      fn.apply(null,[consumer, arguments]); 
     } 
    }); 

    async.waterfall(fns, cb); 

} 

我懷疑任何的這些是正確的

+0

你有什麼錯誤?或者輸出是什麼? –

+0

不幸的是,這是一個更大的代碼庫的一部分,我還沒有測試過它:( –

回答

1

問得好!你是幾乎沒有,只是需要轉換陣列狀arguments數組和CONCAT它consumer

function runWaterfall(consumer, fns, cb) { 

    fns = fns.map(function (fn) { 
     return function() { 
      var args = Array.prototype.slice.call(arguments, 0);   
      fn.apply(null, [consumer].concat(args)); 
     } 
    }); 

    async.waterfall(fns, cb); 

} 
1

您可以使用Function.prototype.bind不僅設置this情況下,也能提供論據。你是密切與apply,但它會立即調用函數,而bind會返回一個函數參數預填充:

fns = fns.map(function (fn) { 
    return fn.bind(null, consumer) 
}); 

https://jsfiddle.net/qmuv8com/

+0

'Apply'不會立即被調用,因爲它在返回函數中。在你的例子中,你將'consumer'作爲第一個參數,但是失去了最後一個參數 –

+1

@RubenNagoga你是對的,'apply'是從返回的函數中調用的。關於第二點:它可能會或可能不是想要的結果,很難用問題中給出的很少的上下文來說明。 – pawel

相關問題