2012-07-07 111 views
7

我需要看少數的Node.js應用程式目錄:傳遞額外的參數JavaScript回調函數

function updated(event, filename){ 
    log("CHANGED\t/share/channels/" + filename); 
} 
for(i in channels) 
    fs.watch('share/channels/' + channels[i], {persistent: false}, updated); 

的問題是,fs.watch只傳遞文件名的回調函數,無包括它所在的目錄。有沒有一種方法可以以某種方式將更多參數傳遞給updated()函數,以便它知道文件的位置?

我想我正在尋找類似於Python的functools.partial的東西,如果這有幫助的話。

回答

4

可以使用Function.bind

function updated(extraInformation, event, filename) { 
    log("CHANGED\t/share/channels/" + extraInformation + filename); 
} 

for(i in channels) 
    fs.watch('share/channels/' + channels[i], {persistent: false}, 
       updated.bind(null, 'wherever/it/is/')); 
+0

我不明白你的例子在所有。你是否明確引用了你添加到函數中的額外參數? – ThorSummoner 2015-01-23 23:11:08

+0

@ThorSummoner:'updated.bind(null,'wherever/it/is /')'返回一個函數,它可以接受兩個參數,前置''where/it/is /',然後傳遞給'updated' 'null'是'this'的未使用值)。 – Ryan 2015-01-24 00:33:55

+0

這個答案是天堂派。 – Proximo 2017-12-12 09:26:34

9

可以傳遞一個不同的函數爲每次迭代:使用JS綁定

var getUpdatedFunction = function(folderName) { 
    return function(event, filename) { 
     log("CHANGED\t" + folderName + "/" + filename); 
    }; 
}; 

for(i in channels) { 
    foldername = 'share/channels/' + channels[i]; 
    fs.watch(foldername, {persistent: false}, getUpdatedFunction(foldername)); 
} 
5

文檔:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

提示,綁定參數發生在調用時間參數之前ETERS。

my_hello = 'Hello!' 
my_world = { 
    'antartica': 'cold', 
} 

anonymous_callback = function (injected1, injected2, param1, param2) { 
    param1 = param1 ? param1 : 'One'; 
    param2 = param2 ? param2 : 'Two'; 

    console.log('param1: (' + typeof(param1) + ') ' + param1) 
    console.log('param2: (' + typeof(param2) + ') ' + param2) 

    console.log('injected1: (' + typeof(injected1) + ') ' + injected1) 
    console.log('injected2: (' + typeof(injected2) + ') ' + injected2) 
    console.log(injected2) 
}.bind(this, my_hello, my_world) 

anonymous_callback('Param 1', 'Param 2') 

輸出:

param1: (string) Param 1 
param2: (string) Param 2 
injected1: (string) Hello! 
injected2: (object) [object Object] 
{ antartica: 'cold' } 
+0

謝謝你,我一直在與這個問題爭鬥好幾個小時,你的解釋很清楚,我終於可以使它工作了。 – bitfidget 2017-10-19 03:27:43

0

您可以通過額外的回調到位

function updated(channel, filename) { 
    log('CHANGED\t ' + channel + '/' + filename); 
} 

for(i in channels) { 
    channel = '/share/channels/' + channels[i]; 
    fs.watch(channel, {persistent: false}, function (extra, event, filename) { 
    updated(channel, filename); 
    }); 
}