【问题标题】:reading files asynchronously in parallel并行异步读取文件
【发布时间】:2012-12-07 15:41:14
【问题描述】:

我的 node.js 应用程序需要多个文件。我知道建议异步读取文件,所以,显然我必须这样做:

fs.readFile("file1", function(...) {
  fs.readFile("file2", function(...) {
    fs.readFile("file3", function(...) {
       [my application]
    }
  }
}

但是,在这种情况下,文件将被顺序读取。

有没有一种方法可以并行读取多个文件,并且仍然确保应用程序在所有文件都加载后启动?

【问题讨论】:

  • 你反对async.js这样的流控库吗?它们确实可以帮助提高此类代码的可读性。

标签: node.js fs


【解决方案1】:

您可以使用现代的基于 Promise 的 API:

import {promises as fs} from 'fs';

function readFiles(files) {
  return Promise.all(
    files.map(path => fs.readFile(path))
  );
}

readFiles(['file1', 'file2', 'file3'])
  .then(fileContents => {
    console.log('All the files are read', fileContents);
  });

【讨论】:

    【解决方案2】:

    很简单。

    var files = [...], remaining = files.length;
    var callback = function () {
        remaining--;
        if (!remaining) {
            go();
        }
    };
    files.forEach(function(file) {
        fs.readFile(file, callback);
    });
    

    【讨论】:

    • 将应用程序 ('go') 放在回调中看起来很不自然。有没有办法确保应用程序仅在文件加载后运行,但不将应用程序置于回调中?像“wait(remaining==0)”这样的东西?
    • 如果你想这样做,你需要确保wait 函数可以解析remaining 引用。例如:function wait(propName, compare){var int=setInterval(function(){if(global[propName] == compare){clearInterval(int);go();}}, 10);}。然后这样称呼它:wait('remaining', 0)
    猜你喜欢
    • 2019-02-20
    • 2021-08-07
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 2019-09-22
    相关资源
    最近更新 更多