Javascript 更好地使用异步IO
我对JS真的很陌生,甚至对node.JS都比较新。因此,使用“传统”编程范例,我的文件如下所示: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%确定这是否是原因) 我的问题:如何异步加载一个大文件(为
var d = require('babyparse');
var fs = require('fs');
var file = fs.readFile('SkuDetail.txt');
d.parse(file);
所以这有很多问题:
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的值设置为任何值。