これは、すべてのファイルが読み込まれたときにすべての約束を解決するためにPromise.all
アプローチを使用して、以前のものの現代Promise
バージョンです。
/**
* 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);
});
});
});
}
これを使用するには:ちょうど同じくらい簡単
をやって:内部約束するので、あなたはあなたにもこのリストを反復処理することができ、フォルダの別のリストを持っていることを
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);
});
});
を。ファンクションブロックsignを取ります。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
わかりました。私はreaddirについてよく分かりませんでした。ブロッキングの弱点は何ですか?私はnode.jsの全体的なポイントは、それがnon-blockingだったと思ったのですか?なぜ私たちはすべて突然ブロックすることができます。 –
非同期コールバックの場合、これを読んでください:http://stackoverflow.com/questions/18983138/callback-after-all-asynchronous-foreach-callbacks-are-completed 多くの間違った答えがありますが、いくつかは正しいです。それらの1つはカウンタを使用します。 – Vanuan