2012-07-07 107 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); 
    }); 
}