我遇到以下问题。我想读取一个在行读取之间具有非阻塞暂停的文件。我分别使用wait.for和lazy来等待和读取文件。
当我调用等待时,出现错误:wait.for 只能在纤程内调用 谁能告诉我如何访问线路对象。我尝试创建一个单独的函数,但随后我丢失了保存该行的行变量。
var lazy = require("lazy"),
fs = require("fs");
wait = require('wait.for');
wait.helper={};
wait.helper.timeout_callback = function(ms,callback){
setTimeout(callback,ms); //call callback(null,null) in ms miliseconds
}
wait.miliseconds = function(ms){
wait.for(wait.helper.timeout_callback,ms);
}
function test(){
new lazy(fs.createReadStream('./test.txt'))
.lines
.forEach(
function(line){
//wait.miliseconds(1*1000); // this causes Error: wait.for can only be called inside a fiber
console.log(line.toString());
}
);
}
wait.launchFiber(test);
最佳答案
如果您不介意非光纤解决方案,这里是一个使用回调的解决方案:
var fs = require('fs');
var stream = fs.createReadStream('file.txt');
stream.on('data', onData).buffer = '';
function onData(chunk) {
var i, hasData = Buffer.isBuffer(chunk);
if (hasData) {
stream.buffer += chunk.toString('utf8');
if (stream.paused)
return;
}
if ((i = stream.buffer.indexOf('\n')) > -1) {
var line = stream.buffer.substring(0, i);
stream.buffer = stream.buffer.substring(i + 1);
stream.pause();
stream.paused = true;
onLine(line, onData);
} else if (!hasData) {
stream.resume();
stream.paused = false;
}
}
function onLine(line, cb) {
setTimeout(function() {
// do something with line
console.log(line);
cb();
}, 1000);
}
关于javascript - 在nodejs中使用wait.for暂停非阻塞文件读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23173136/