0

我正在使用 wdavidw 的 node-csv-parser 和咖啡脚本。我知道(或应该知道)变量作用域、绑定、全局变量,但是看着这段代码片段,我无法理解 @array varable 丢失了它的值甚至被分配了什么。

脚本.咖啡:

    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:(master) ✗ 咖啡脚本.coffee

代码输出为:

引用错误
引用错误
引用错误
引用错误

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

城市 1
城市 2
城市 3

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

我是否误解了 node-csv-parser 的工作原理或这个模块有什么问题?

提前致谢!

4

1 回答 1

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变量才会被修改。如果不清楚,您应该复习一下 node.js 中回调和执行顺序的基础知识。console.logfind_lines

其他小问题

  1. require 'csv'应该csv = require 'csv'
  2. array没有被修改data,它被覆盖在每个新的 csv 行上
于 2012-08-08T19:22:59.897 回答