這是一個現代Promise
版的前一個,使用一個Promise.all
方法時,所有文件都被讀取來解決所有的承諾:
/**
* Promise all
* @author Loreto Parisi (loretoparisi at gmail dot com)
*/
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);
} //promiseAll
/**
* read files
* @param dirname string
* @return Promise
* @author Loreto Parisi (loretoparisi at gmail dot com)
* @see http://stackoverflow.com/questions/10049557/reading-all-files-in-a-directory-store-them-in-objects-and-send-the-object
*/
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);
});
});
});
}
How使用方法:
一樣簡單做:
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
確實神奇
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);
});
});
:所有將解決每個然後異步。它採用簽名爲function(item,index,resolve,reject)
的功能塊,其中item
是陣列中的當前項目,index
在陣列中的位置,resolve
和reject
和Promise
回調函數。
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'方法。 http://nodejs.org/docs/v0.4.8/api/fs.html#fs.readdirSync – rjz 2012-04-06 21:42:29
好吧,我不知道readdir,這可以是有幫助的。阻塞的缺點是什麼?我認爲node.js的重點是它是非阻塞的?爲什麼我們可以突然阻止。 – 2012-04-06 21:51:42
對於異步回調閱讀此:http://stackoverflow.com/questions/18983138/callback-after-all-asynchronous-foreach-callbacks-are-completed 有很多錯誤的答案,但有些是正確的。其中一個使用計數器。 – Vanuan 2015-12-23 18:07:21