javascript - 在nodejs中使用wait.for暂停非阻塞文件读取

标签 javascript node.js file-io wait

我遇到以下问题。我想读取一个在行读取之间具有非阻塞暂停的文件。我分别使用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/

相关文章:

javascript - 访问 javascript 对象中的更高 namespace

javascript - 在文件中设置 Harmony 标志

c++ - 拦截windows打开的文件

javascript - CSS 样式在警告消息后消失

javascript - 与 session$sendCustomMessage 的 Shiny 和 JavaScript 交互

javascript - 水平滑出菜单在 Firefox 中不起作用

node.js - nginx 和 socket.io 解决方法

node.js - 读取 pug 中的 window.navigator.language

python - 将文件字符串读入数组(以 pythonic 方式)

java - 如何用java编写文件搜索程序?