更好地使用异步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);
所以这有很多问题:
- 不是异步的
- 我的文件大于默认的最大文件大小(这个大约 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",其后的代码可能更直接,将首先执行。
我对JS真的很陌生,对node.js更陌生。因此,使用 "traditional" 编程范例,我的文件如下所示:
var d = require('babyparse');
var fs = require('fs');
var file = fs.readFile('SkuDetail.txt');
d.parse(file);
所以这有很多问题:
- 不是异步的
- 我的文件大于默认的最大文件大小(这个大约 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",其后的代码可能更直接,将首先执行。