2012-07-07 18 views
7

ho bisogno di guardare un piccolo numero di directory in un'applicazione Node.JS:Passo ulteriore parametro di funzione di callback JavaScript

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

Il problema è che fs.watch passa solo il nome del file per la funzione di callback, senza inclusa la directory in cui si trova. Esiste un modo per passare in qualche modo un parametro aggiuntivo alla funzione updated() in modo che sappia dove si trova il file?

Penso che sto cercando qualcosa di simile a Python functools.partial, se questo aiuta qualsiasi.

risposta

4

È possibile utilizzare 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

Non seguo il tuo esempio a tutti. Hai anche fatto esplicitamente riferimento al parametro extra che hai aggiunto alla funzione? – ThorSummoner

+0

@ThorSummoner: 'updated.bind (null, 'where/it/is /')' restituisce una funzione che può assumere due argomenti, anteporre ''ovunque/it/is /', e quindi passarla a 'updated' (con 'null' è il valore inutilizzato per' this'). – Ryan

+0

Questa risposta è stata inviata al cielo. – Proximo

9

È possibile passare una funzione differente per ogni iterazione:

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

Esempio con JS Bind

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

Tip, i parametri associati si verificano prima del parametro call-time etri.

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') 

uscita:

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

Grazie, ho combattuto con questo problema per ore e la tua spiegazione è così chiara che sono riuscito finalmente a farlo funzionare. – bitfidget

0

È possibile passare ulteriore richiamata al posto

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); 
    }); 
} 
Problemi correlati