2012-07-07 17 views
7

मैं एक 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 केवल कॉलबैक फ़ंक्शन पर फ़ाइल नाम से गुजरता है, बिना इसमें निर्देशिका भी शामिल है। क्या कोई तरीका है कि मैं किसी भी तरह से अद्यतन() फ़ंक्शन में अतिरिक्त पैरामीटर में पास कर सकता हूं, इसलिए यह जानता है कि फ़ाइल कहां है?

मुझे लगता है कि मैं पाइथन के 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

+0

@ThorSummoner: 'update.bind (शून्य, 'जहां भी/यह/है /') एक ऐसा फ़ंक्शन देता है जो दो तर्क ले सकता है, 'जहां भी/यह/है /' प्रीपेड करें, और उसके बाद उसे 'अपडेट किया गया' 'शून्य' के साथ 'शून्य' के लिए अप्रयुक्त मूल्य होने के साथ)। – Ryan

+0

यह उत्तर स्वर्ग भेजा गया था। – Proximo

9

आप प्रत्येक यात्रा के लिए एक अलग समारोह पारित कर सकते हैं:

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

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); 
    }); 
} 
संबंधित मुद्दे