更好地使用异步IO

Use Asynchronous IO better

我对JS真的很陌生,对node.js更陌生。因此,使用 "traditional" 编程范例,我的文件如下所示:

var d = require('babyparse');
var fs = require('fs');

var file = fs.readFile('SkuDetail.txt');

d.parse(file);

所以这有很多问题:

  1. 不是异步的
  2. 我的文件大于默认的最大文件大小(这个大约 60mb),因此它目前已损坏(不能 100% 确定是否是这个原因)。

我的问题:我如何异步加载一个大文件(这将明显大于 60mb 以备将来使用),并在我获取信息时进行解析。那么作为后续,我怎么知道什么时候一切都完成了?

您应该创建一个 ReadStream。一个常见的模式看起来像这样。当数据在 data 事件中可用时,您可以对其进行解析。

function readFile(filePath, done) {
    var 
        stream = fs.createReadStream(filePath),
        out = '';

    // Make done optional
    done = done || function(err) { if(err) throw err; };

    stream.on('data', function(data) {
        // Parse data
        out += data;
    });

    stream.on('end', function(){
        done(null, out); // All data is read
    });

    stream.on('error', function(err) {
        done(err);
    });
}

您可以使用如下方法:

readFile('SkuDetail.txt', function(err, out) {
    // Handle error
    if(err) throw err;

    // File has been read and parsed
}

如果您将已解析的数据添加到 out 变量,整个已解析的文件将被发送到 done 回调。

对于第一个问题,因为你想处理块,Streams 可能就是你要找的。 @pstenstrm 在他的回答中有一个例子。

此外,您可以查看此 Node.js 文档 link 以了解流:https://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options

如果您想要 Streams 的简要说明和示例,请查看此 link:http://www.sitepoint.com/basics-node-js-streams/

您可以将回调传递给 fs.readFile 函数以在文件读取完成后处理内容。这将回答你的第二个问题。

fs.readFile('SkuDetail.txt', function(err, data){
    if(err){
         throw err;
    }
    processFile(data);
});

您可以查看Get data from fs.readFile了解更多详情。

此外,您可以使用 Promises 来获得更简洁的代码以及其他好处。检查此 link:http://promise-nuggets.github.io/articles/03-power-of-then-sync-processing.html

它已经是异步的,javascript是异步的,您不需要额外的努力。您的代码是否有效?我认为您的解析应该在读取的回调中。否则跳过 readfile 并且 file 为空。

在正常情况下,您编写的任何 io 代码都将是 "skipped",其后的代码可能更直接,将首先执行。