यह Promise
पिछले सभी का एक आधुनिक संस्करण है, जिसमें Promise.all
सभी फाइलों को पढ़ने के बाद सभी वादों को हल करने के लिए एक दृष्टिकोण का उपयोग किया गया है:
function promiseAllP(items, block) {
var promises = [];
items.forEach(function(item,index) {
promises.push( function(item,i) {
return new Promise(function(resolve, reject) {
return block.apply(this,[item,index,resolve,reject]);
});
}(item,index))
});
return Promise.all(promises);
}
function readFiles(dirname) {
return new Promise((resolve, reject) => {
fs.readdir(dirname, function(err, filenames) {
if (err) return reject(err);
promiseAllP(filenames,
(filename,index,resolve,reject) => {
fs.readFile(path.resolve(dirname, filename), 'utf-8', function(err, content) {
if (err) return reject(err);
return resolve({filename: filename, contents: content});
});
})
.then(results => {
return resolve(results);
})
.catch(error => {
return reject(error);
});
});
});
}
इसे कैसे उपयोग करे:
बस के रूप में कर के रूप में सरल:
readFiles( EMAIL_ROOT + '/' + folder)
.then(files => {
console.log( "loaded ", files.length );
files.forEach( (item, index) => {
console.log( "item",index, "size ", item.contents.length);
});
})
.catch( error => {
console.log( error );
});
माना जाता है कि आपके पास उन फ़ोल्डरों की एक और सूची है जो आप इस सूची पर अच्छी तरह से पुनरावृत्त कर सकते हैं, क्योंकि आंतरिक वादा.सभी तब अतुल्यकालिक रूप से प्रत्येक को हल करेगा:
var folders=['spam','ham'];
folders.forEach( folder => {
readFiles( EMAIL_ROOT + '/' + folder)
.then(files => {
console.log( "loaded ", files.length );
files.forEach( (item, index) => {
console.log( "item",index, "size ", item.contents.length);
});
})
.catch( error => {
console.log( error );
});
});
यह काम किस प्रकार करता है
promiseAll
जादू करता है। यह हस्ताक्षर के एक समारोह ब्लॉक लेता है function(item,index,resolve,reject)
, जहां item
सरणी में वर्तमान आइटम, है index
सरणी में अपनी स्थिति, और resolve
और कॉलबैक कार्य करता है। प्रत्येक वादे को वर्तमान में और वर्तमान फ़ंक्शन के साथ अनाम फ़ंक्शन कॉल के माध्यम से तर्क के रूप में धकेल दिया जाएगा :reject
Promise
index
item
promises.push( function(item,i) {
return new Promise(function(resolve, reject) {
return block.apply(this,[item,index,resolve,reject]);
});
}(item,index))
तब सभी वादों को हल किया जाएगा:
return Promise.all(promises);
readfileSync
औरreaddirSync
विधियों का उपयोग करके ईवेंट हैंडलर को छोड़ सकते हैं । nodejs.org/docs/v0.4.8/api/fs.html#fs.readdirSync