Bu, tüm dosyalar okunduğunda tüm vaatleri çözmek Promiseiçin bir Promise.allyaklaşım kullanan, öncekinin modern bir sürümüdür :
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);
});
});
});
}
Bu nasıl kullanılır:
Yapmak kadar basit:
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 );
});
Diyelim ki, dahili promise.all her birini eşzamansız olarak çözeceğinden, bu listeyi yineleyebileceğiniz başka bir klasör listeniz olduğunu varsayalım:
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 );
});
});
Nasıl çalışır
promiseAllBüyü yapar. Bu imzanın bir fonksiyon bloğunu alır function(item,index,resolve,reject), itemcari dizide öğesi olan indexdizide konumu ve resolveve geri arama fonksiyonları. Her söz, anonim bir işlev çağrısı aracılığıyla geçerli ve geçerli argüman olarak bir dizi içinde itilecektir :rejectPromiseindexitem
promises.push( function(item,i) {
return new Promise(function(resolve, reject) {
return block.apply(this,[item,index,resolve,reject]);
});
}(item,index))
Sonra tüm sözler çözülecek:
return Promise.all(promises);
readfileSyncvereaddirSyncyöntemlerini kullanarak olay işleyicisini atlayabilirsiniz . nodejs.org/docs/v0.4.8/api/fs.html#fs.readdirSync