2011-12-30 13 views
6

मैं एक सरणी पर पुनरावृत्त कर रहा हूं जिसमें फ़ाइल नाम हैं। उनमें से प्रत्येक के लिए, मैं readFile() का आह्वान करता हूं। जब संबंधित कॉलबैक लागू किया जाता है, तो मैं पैरामीटर के रूप में readFile() पर फ़ाइल नाम पुनर्प्राप्त करना चाहता हूं। क्या यह किया जा सकता है?NodeJS readFile() फ़ाइल नाम पुनर्प्राप्त करें

मेरे इरादे को बेहतर तरीके से समझाने के लिए एक स्निप कोड को संलग्न किया गया।

var fs = require("fs"); 
var files = ["first.txt", "second.txt"]; 
for (var index in files) { 
    fs.readFile(files[index], function(err, data) { 
     //var filename = files[index]; 
     // If I am not mistaken, readFile() is asynchronous. Hence, when its 
     // callback is invoked, files[index] may correspond to a different file. 
     // (the index had a progression). 
    }); 

} 
+0

नीचे सब समाधान देखें। जिनमें से प्रत्येक सही है। – MrIzik

उत्तर

6

तुम भी एक for पाश के बजाय forEach इस्तेमाल कर सकते हैं:

files.forEach(function (file){ 
    fs.readFile(file, function (err, data){ 
    console.log("Reading %s...", file) 
    }) 
}) 
+0

यह सबसे सरल, सबसे पठनीय और सबसे सही उत्तर है! – TooTallNate

+0

यह सही है, लेकिन प्रीप्रोसेसिंग की आवश्यकता होने पर कुछ सीमा है। – MrIzik

7

आप क्या कर सकते हैं कि एक बंद का उपयोग कर:

for (var index in files) { 
    (function (filename) { 
     fs.readFile(filename, function(err, data) { 
      // You can use 'filename' here as well. 
      console.log(filename); 
     }); 
    }(files[index])); 
} 

अब हर फ़ाइल नाम एक समारोह के पैरामीटर के रूप में सहेजा जाता है और पाश अपनी यात्रा जारी रखने के कारण प्रभावित नहीं होगा।

0

आप तर्क देने के लिए Function.prototype.bind का भी उपयोग कर सकते हैं। bind एक नया फ़ंक्शन लौटाएगा, जिसे कॉल किया जाता है, मूल फ़ंक्शन को फाइल [इंडेक्स] के साथ पहली तर्क के रूप में कॉल करता है।

लेकिन यह नहीं पता कि यह करने का यह एक अच्छा तरीका है।

var fs = require("fs"); 
var files = {"first.txt", "second.txt"}; 
for (var index in files) { 
    fs.readFile(files[index], 
     (function(filename, err, data) { 
      //filename 
     }).bind(null, files[index]) 
    ); 

} 
+0

'इस मामले में फंक्शन # बाइंड() 'पूरी तरह से अनावश्यक है, और केवल एक प्रदर्शन जुर्माना है। इस मामले में आपको बस प्रत्येक लूप पुनरावृत्ति के लिए एक नया बंद करने की आवश्यकता है। 'एरे # के लिए प्रत्येक() 'का उपयोग करना, जैसे @ डैनमैक्टो सुझाव देता है, मेरी राय में" सबसे साफ "तरीका है। – TooTallNate

+0

मेरी आंखें खोलने के लिए धन्यवाद – MrIzik

संबंधित मुद्दे