Javascript 更好地使用异步IO

Javascript 更好地使用异步IO,javascript,node.js,asynchronous,papaparse,Javascript,Node.js,Asynchronous,Papaparse,我对JS真的很陌生,甚至对node.JS都比较新。因此,使用“传统”编程范例,我的文件如下所示: var d = require('babyparse'); var fs = require('fs'); var file = fs.readFile('SkuDetail.txt'); d.parse(file); 所以这有很多问题: 它不是异步的 我的文件大于默认的最大文件大小(这一个大约为60mb),因此它当前会中断(无法100%确定这是否是原因) 我的问题:如何异步加载一个大文件(为

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

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

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

d.parse(file);
所以这有很多问题:

  • 它不是异步的
  • 我的文件大于默认的最大文件大小(这一个大约为60mb),因此它当前会中断(无法100%确定这是否是原因)
  • 我的问题:如何异步加载一个大文件(为了将来的使用,这个文件将大大超过60mb),并在获取信息时进行解析。接下来,我怎么知道什么时候一切都完成了呢?

    您应该创建一个。一个常见的模式如下所示。您可以在
    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
    回调。

    对于第一个问题,因为您要处理块,所以流可能就是您要找的@pstenstrm在他的回答中有一个例子

    此外,您还可以查看Node.js文档链接中的流:

    如果您想要流的简要说明和示例,请检查此链接:

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

    fs.readFile('SkuDetail.txt', function(err, data){
        if(err){
             throw err;
        }
        processFile(data);
    });
    
    您可以查看更多详细信息


    此外,您还可以使用承诺来获得更干净的代码和其他附加的好处。检查此链接:

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


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

    没错,在处理大文件时,最好使用流。我假设这里的回调函数是done。很抱歉我的N00B,但该函数看起来如何?函数完成(错误,数据){/..}“done(null,out);”-“undefined”不是函数“Yes,
    done
    是回调”。我将更新一些使用示例。是的,第一组代码不起作用,似乎是因为它没有成功加载文件。(但我仍在调试它)。即使它加载了文件,也必须将d.parse放在var file=fs.readFile('skudail.txt')的回调中;因为否则javascript不会将file的值设置为任何值。