如何在node.js中完成一系列readFile调用时运行函数?

时间:2017-05-18 23:22:23

标签: javascript node.js asynchronous callback

在node.js中,我有一个循环文件​​夹的模块。它实际上有一个函数回调,它在完成从目录读取时触发。但是对于它找到的每个文件,我运行一个readFile命令,它是异步函数,读取文件,并且它也有一个回调函数。问题是,如何设置它以便在目录循环函数完成后还有一个回调以及每个readFile函数?

var klaw = require('klaw');
var fse = require('fs-extra');

var items = [];

klaw("items").on('data', function (item) {
    var dir = item.path.indexOf(".") == -1;
    // if its a file
    if (!dir) {
        var filename = item.path;
        if (filename.toLowerCase().endsWith(".json")) {
            fse.readFile(filename, function(err, data) {
                if (err) return console.error(err);
                items.push(JSON.parse(data.toString()));
            });
        }
    }
}).on('end', function () {

});

1 个答案:

答案 0 :(得分:1)

尝试这样的事情

    import Promise from 'Bluebird';

    const processing = []
    const items = [];

   klaw("items")
    .on('data', item => processing.push(
      Promise.promisify(fs.readFile))(item.path)
      .then(content => items.push(JSON.parse(content.toString())))
      .catch(err => null)
    )
    .on('end', () => {
        Promise.all(processing)
        .then(nothing => console.log(items))
    })

或喜欢

const processing = []

klaw("items")
.on(
  'data',
  item => processing.push(Promise.promisify(fs.readFile)(item.path))
)
.on(
  'end',
  () => {
    Promise.all(processing)
    .then(contents => (
      contents.map(content =>(JSON.parse(content.toString())))
    )
    .then(items => console.log(items))

})