带有全局变量、咖啡脚本和回调的模块 CSV

module csv with global variables, coffeescript and callbacks

本文关键字:回调 模块 CSV 脚本 全局变量 咖啡      更新时间:2023-09-26

我正在使用wdavidw的node-csv-parser with coffeescript。我知道(或应该知道)变量范围、绑定、全局变量,但看着这个代码片段,我不明白变量@array会丢失其值甚至被分配什么。

脚本咖啡:

    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的工作原理或此模块的任何问题?

提前感谢!

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

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()

请注意,您可能希望在"data"回调中除array.push data[0]之外的其他内容。

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

或者,您可以通过将array移动到模块范围来使其在find_lines之外可见,如下所示:

csv = require 'csv'
array = []
find_lines = ->
  csv()
  ...

但是,(这是真正关键的一点),在模块代码的其余部分(包括find_lines之外的console.log的任何调用)已经执行之前,array变量不会被修改。如果不清楚,您应该复习 node.js 中回调和执行顺序的基本原理。

其他小问题

  1. require 'csv'应该csv = require 'csv'
  2. array没有被data修改,而是在每个新的csv行上被覆盖