2

我对 JS 真的很陌生,甚至对 node.js 也很陌生。因此,使用“传统”编程范例,我的文件如下所示:

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

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

d.parse(file);

所以这有很多问题:

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

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

4

3 回答 3

5

您应该创建一个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回调。

于 2015-06-11T07:39:00.730 回答
0

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

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

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

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

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

您可以查看从 fs.readFile 获取数据以获取更多详细信息。

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

于 2015-06-11T07:47:16.943 回答
0

它已经是异步的,javascript 是异步的,您无需付出额外的努力。你的代码还能工作吗?我认为您的解析应该在 read 的回调中。否则 readfile 被跳过并且文件为空。

在正常情况下,您编写的任何 io 代码都将被“跳过”,并且可能更直接的代码将首先执行。

于 2015-06-11T07:57:10.193 回答