Передайте дополнительный параметр функции обратного вызова Javascript
Мне нужно посмотреть небольшое количество каталогов в приложении Node.JS:
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
, если это помогает любому.
Ответы
Ответ 1
Вы можете использовать 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/'));
Ответ 2
Вы можете передать другую функцию для каждой итерации:
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));
}
Ответ 3
Пример использования JS Bind
Doc: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
Совет, связанные параметры происходят до параметров времени вызова.
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' }
Ответ 4
Вы можете передать дополнительный обратный вызов на место
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);
});
}