2012-07-07 14 views
7

muszę oglądać niewielką liczbę katalogów w aplikacji node.js:zdać dodatkowy parametr do funkcji wywołania zwrotnego JavaScript

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

Problem polega na tym, że fs.watch przechodzi tylko nazwę pliku do funkcji wywołania zwrotnego, bez włączając w to katalog, w którym jest. Czy jest jakiś sposób, w jaki sposób mogę przekazać dodatkowy parametr do funkcji updated(), aby wiedział, gdzie znajduje się plik?

Myślę, że szukam czegoś podobnego do Pythona functools.partial, jeśli to pomoże.

Odpowiedz

4

można wykorzystywać 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

Nie śladem w ogóle. Czy nawet wyraźnie wskazałeś dodatkowy parametr dodany do funkcji? – ThorSummoner

+0

@ThorSummoner: 'updated.bind (null, 'wherever/it/is /')' zwraca funkcję, która może przyjąć dwa argumenty, poprzedzić ''gdziekolwiek/it/jest /', a następnie przekazać to do 'updated' (z 'null' będącym nieużywaną wartością' this'). – Ryan

+0

Ta odpowiedź została wysłana do nieba. – Proximo

9

można przekazać inną funkcję w każdej iteracji:

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

przykład za pomocą JS oprawę

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

Tip związane parametry występują przed parametrem czasu połączenia 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') 

wyjściowa:

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

Dziękuję, walczę z tym problemem od wielu godzin, a twoje wyjaśnienie jest tak jasne, że mogłem w końcu sprawić, by działało. – bitfidget

0

Można zdać dodatkowy zwrotnego w miejscu

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); 
    }); 
} 
Powiązane problemy