Знание EOF при использовании node.js и lazy - PullRequest
2 голосов
/ 04 августа 2011

У меня есть подпрограмма, написанная на CoffeeScript, работающая в файле node.js, которая читает строки из Jade-файла.Это выглядит так:

each_line = (file, callback) ->
  last_line = null

  lazy = Lazy(fs.createReadStream(file)).lines.map(String).filter (line) -> 
    not (
      # Filter the not interesting rows in the top of the file
      /^html$/i.test(line) or 
      /^\s+body$/i.test(line) or 
      /^\s+\/\/\s+Generator.*$/i.test(line)
      )

  lazy.forEach (line) ->
    # We only emit those lines that are whole lines, multilines will become joined
    if /^\t/g.test(line)
      last_line += line.replace(/\t/g, '').replace(/(\r\n|\n|\r)/gm," ")
    else
      callback(last_line) if last_line
      last_line = line.replace(/(\r\n|\n|\r)/gm," ")

Поскольку все это выполняется асинхронно, мне нужно знать EOF, чтобы я мог выполнять операции после завершения всей итерации.У кого-нибудь есть предложения?

Ответы [ 2 ]

4 голосов
/ 04 августа 2011

Я предвосхищу это, сказав, что я сам не использовал Lazy, а просто посмотрел документы.

Я ожидал, что Lazy выдаст событие 'end', но я не могу сказать, так ли это, в любом случае вы можете привязать обратный вызов непосредственно к событию end в потоке чтения.

each_line = (file, callback, eof_callback) ->
  last_line = null

  stream = fs.createReadStream file

  stream.on 'end', eof_callback

  lazy = Lazy(stream).lines.map(String).filter (line) -> 
    not (
      # Filter the not interesting rows in the top of the file
      /^html$/i.test(line) or 
      /^\s+body$/i.test(line) or 
      /^\s+\/\/\s+Generator.*$/i.test(line)
      )

  lazy.forEach (line) ->
    # We only emit those lines that are whole lines, multilines will become joined
    if /^\t/g.test(line)
      last_line += line.replace(/\t/g, '').replace(/(\r\n|\n|\r)/gm," ")
    else
      callback(last_line) if last_line
      last_line = line.replace(/(\r\n|\n|\r)/gm," ")
1 голос
/ 07 марта 2013

Я полагаю, что Lazy создаст событие 'end' для исходного объекта Lazy, который был создан:

Lazy = require('lazy')
fs = require('fs')

readLines = (filename, next) ->
  lazy = new Lazy(fs.createReadStream(filename))
  lazy.on 'end', ->
    if next then next null
  lazy.lines.forEach (line) ->
    console.log 'Read line:', line.toString()

readLines process.argv[1], ->
  console.log 'All done.'
...