0

wdavidwのnode-csv-parserを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 script.coffee

コード出力は次のとおりです。

引用された偽
引用された偽
引用された偽
引用された偽

あるべきとき(csv値による):

都市 1
都市 2
都市 3

csv パーサーから.transformメソッドを使用すると、同じエラーが発生します。

node-csv-parser がどのように機能するか、またはこのモジュールの問題を誤解しましたか?

前もって感謝します!

4

1 に答える 1

0

考えられる1つの実装から始めましょう。

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]'data'コールバック以外のものが必要になる可能性があることに注意してください。

変数は「data」および「end」コールバックで使用できる@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 に答える