带有全局变量、咖啡脚本和回调的模块 CSV
module csv with global variables, coffeescript and callbacks
我正在使用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 中回调和执行顺序的基本原理。
其他小问题
-
require 'csv'
应该csv = require 'csv'
-
array
没有被data
修改,而是在每个新的csv行上被覆盖
相关文章:
- 带有全局变量、咖啡脚本和回调的模块 CSV
- 如何使用RequireJS进行跨模块回调/事件处理
- 使用其他模块中的函数,避免异步回调地狱
- NodeJS异步模块:如何在回调中获取results对象
- 无法在模块中执行回调,使用 Node-Cron导出对象
- 节点.JS请求模块回调未触发
- 模块模式内的回调函数中的“this”指的是什么
- 正在node.js中为所需模块创建回调
- npm异步模块未执行最终回调
- require.js-未定义的模块作为参数传递以定义回调
- 使用异步模块在读取所有文件后触发回调
- 如何执行我的回调函数是一个自定义Dojo模块
- 作为回调受害者的 JS 模块模式的公共方法.(本期)
- 导出模块中的Node js回调
- 理解模块.用回调导出
- Node.js:使用Bluebird将模块函数从回调转换为承诺
- 如何在 Node.js 模块中处理异步回调
- Nodejs异步编程——为什么有“async"模块需要吗?什么是“回调地狱”/“末日金字塔”
- 调用另一个模块函数作为回调[ES6]
- 模块模式回调实现