如何通过async / awaitasynchronous读取和汇总所有文件的数据

我知道蓝鸟或fs-promise甚至es6承诺可以做到这一点。 像下面我已经完成。

但是我想用最新的es7 async / await来实现。 我只是没有得到如何在for循环中使用asynchronous/等待(然后总结他们的结果)。

我search的大多数例子都是关于fetch / ajax.get的。 但我想要的是读取文件和汇总数据在一起。

可能有人提示? 谢谢。

var fs = require("fs"); var Promise = require("promise"); function readDir(){ var p = new Promise( function(resolve, reject) { fs.readdir( ".", function( err, files) { resolve(files); }) } ); return p; } function readFile(file){ var p = new Promise( function(resolve, reject) { fs.readFile( file, function( err, data) { console.log("Successfully read a file.", file); resolve(data); }) } ); return p; } readDir().then(function(files){ var promises = []; for ( var i = 0; i < files.length; i++ ) { promises.push( readFile(files[i]) ); } Promise.all( promises ).then( function(results) { var totalBytes = 0; for ( i = 0; i < results.length; i++ ) { totalBytes += results[i].length; } console.log("Done reading files. totalBytes = " + totalBytes); }); }); 

首先要使用async / await,无论如何我们需要Promise。 只是因为不同于promise,我们不能await基于callback的函数。

所以为了让它开始,我build议使用蓝鸟的.promisifyAll方法,所有fs方法跟在'asynchronous'后缀将返回承诺。

至less你会有:

 'use strict'; const Promise = require('bluebird'); const fs = Promise.promisifyAll(require('fs')); async function readFile(file) { let data = await fs.readFileAsync(file); console.log('Successfully read a file.', file); return data; } async function getTotalBytes() { let files = await fs.readdirAsync('.'); //Making a promise for each file to read it. let promises = files.map(f => readFile(f)); //Reading all in parallel let results = await Promise.all(promises); //Using native .reduce to sum the bytes let totalBytes = results.reduce((memo, r) => { return memo + r.length; }, 0); console.log('Done reading files. totalBytes = ' + totalBytes); return totalBytes; } //Running out function getTotalBytes() .then(bytes => console.log(bytes)) .catch(err => console.error(err));