Đây là Promisephiên bản hiện đại của phiên bản trước, sử dụng cách Promise.alltiếp cận để giải quyết tất cả các lời hứa khi tất cả các tệp đã được đọc:
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);
});
});
});
}
Làm thế nào để sử dụng nó:
Chỉ đơn giản như làm:
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 );
});
Giả sử rằng bạn có một danh sách các thư mục khác, bạn cũng có thể lặp lại danh sách này, vì nội bộ Prom.all sẽ giải quyết từng thư mục một cách không đồng bộ:
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 );
});
});
Làm thế nào nó hoạt động
Điều promiseAllkỳ diệu không. Nó có một khối chức năng của chữ ký function(item,index,resolve,reject), vị trí itemcủa mục hiện tại trong mảng, indexvị trí của nó trong mảng resolvevà rejectcác Promisehàm gọi lại. Mỗi lời hứa sẽ được đẩy vào một mảng ở thời điểm hiện tại indexvà với hiện tại itemlà các đối số thông qua một lệnh gọi hàm ẩn danh:
promises.push( function(item,i) {
return new Promise(function(resolve, reject) {
return block.apply(this,[item,index,resolve,reject]);
});
}(item,index))
Sau đó, tất cả các lời hứa sẽ được giải quyết:
return Promise.all(promises);
readfileSyncvàreaddirSynccác phương thức. nodejs.org/docs/v0.4.8/api/fs.html#fs.readdirSync