2012-07-07 6 views
7

Necesito ver una pequeña cantidad de directorios en una aplicación Node.JS:Pass parámetro adicional a la función de devolución de llamada Javascript

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

El problema es que fs.watch sólo deja pasar el nombre de archivo para la función de devolución de llamada, sin incluyendo el directorio en el que se encuentra. ¿Hay alguna forma en que de alguna manera pueda pasar un parámetro adicional a la función updated() para que sepa dónde está el archivo?

Creo que estoy buscando algo similar a functools.partial de Python, si eso ayuda.

Respuesta

4

Puede utilizar 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

no sigo su ejemplo en absoluto. ¿Hiciste referencia explícitamente al parámetro adicional que agregaste a la función? – ThorSummoner

+0

@ThorSummoner: 'updated.bind (null, 'anywhere/it/is /')' devuelve una función que puede tomar dos argumentos, antepone ''where/it/is /', y luego pasa eso a 'updated' (con 'null' siendo el valor no utilizado para' this'). – Ryan

+0

Esta respuesta fue enviada al cielo. – Proximo

9

puede pasar una función diferente para cada iteración:

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

Ejemplo utilizando JS Enlazar

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

Tip, los parámetros vinculados ocurren antes del parámetro de tiempo de llamada 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') 

Salida:

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

Gracias, he estado batallando con este problema durante horas y su explicación es tan clara que finalmente pude hacerlo funcionar. – bitfidget

0

Puede pasar de devolución de llamada adicional en lugar

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); 
    }); 
} 
Cuestiones relacionadas