带有全局变量,coffeescript和回调的模块csv

时间:2012-08-08 13:03:48

标签: javascript node.js csv coffeescript global-variables

我正在使用wdavidw的node-csv-parser和coffeescript。我知道(或应该知道)变量scope,bind,globals,但是看看这段代码片段,我无法理解@array varable会丢失它的值甚至被分配。

script.coffee:

    require 'csv'
    find_lines = ->
        @array = []
        csv()
            .fromPath("#{__dirname}/Cities.csv", {delimiter:";"})
            .on 'data', (data, index) =>
                @array = data

    console.log @array

    find_lines()

运行script.coffe:

  

➜模块git :(主)✗咖啡script.coffee

代码输出为:

  

引用虚假的   引用虚假   引用虚假   引用虚假

应该是什么时候(根据csv值):

  

城市1   城市2   城市3

使用csv解析器中的 .transform 方法会产生相同的错误。

我是否误解了node-csv-parser的工作原理或该模块的任何问题?

提前致谢!

1 个答案:

答案 0 :(得分:0)

让我们从一个可能的实现开始:

csv = require 'csv'

find_lines = ->
  array = []
  csv()
  .fromPath("#{__dirname}/Cities.csv", {delimiter:";"})
  .on 'data', (data) ->
    array.push data[0]
  .on 'end', ->
    console.log array

find_lines()

请注意,您可能需要在“数据”回调中使用array.push data[0]以外的其他内容。

您不需要在此使用@array,因为array变量可用于'数据'和'结束'回调。这也消除了对胖箭头功能绑定的需要。在此实现中,array变量仅在find_lines的范围内可见,因此您将无法从函数调用之外记录其内容。

或者,您可以将array显示在find_lines之外,方法是将其移至模块范围,如下所示:

csv = require 'csv'
array = []

find_lines = ->
  csv()
  ...

然而,(这是非常关键的一点),array变量 将被修改,直到模块代码的其余部分(包括对{{1}的任何调用)之后console.log之外的}已经执行了。如果不清楚,你应该了解node.js中回调和执行顺序的基础知识。

其他小问题

  1. find_lines应为require 'csv'
  2. csv = require 'csv'未被array修改,而是在每个新的csv行上被覆盖