0

私は初めてですcoffeescript。そして、JavaScript の変数スコープの穴に落ちました。

node.jsクラスなし(まだ)、最小限の関数型プログラミングシュガー(まだ)を使用して、単純なコンソールスクリプトを開発しようとしています。ここに行きます:

fs      = require 'fs'
code    = "test"

fs.readFile 'COD99000430.TXT', (err, contents) ->
    code = contents.toString()

console.log code

次の JavaScript にコンパイルされます。

// Generated by CoffeeScript 1.3.3
(function() {
  var code, fs;

  fs = require('fs');

  code = "test";

  fs.readFile('COD99000430.TXT', function(err, contents) {
    return code = contents.toString();
  });

  console.log(code);

}).call(this);

問題は、そのコード コンソールを実行した後、明らかに変数testの初期値であるword のみが表示されることです。codeしかし、ファイルの内容が表示されることを期待していCOD99000430.TXTます。console.log codeそして、呼び出しで匿名コールバック関数のスコープ内に入れると、実際にそれを見ることができfs.readFileます。

私はcoffieescript のドキュメントを見てきましたが、まったく同じケースが説明されていました。しかし、何らかの理由でそれは私にはうまくいきません。

node.jsWindows 7、coffeescriptバージョン 1.3.3でバージョン 0.8.2を使用しています。

私の場合、「グローバルスクリプト」変数を持つことは可能ですか? コーヒースクリプトを介してこれを達成するにはどうすればよいですか?

4

2 に答える 2

1

あなたの質問に対するコメントは正しいです。実際のコードを提供したいと思いました。

例 1: ファイルの内容をfs.readFileコールバックに記録するだけです。

fs = require 'fs'

fs.readFile 'COD99000430.TXT', (err, contents) ->
  console.log contents.toString()

例 2: ファイル処理コードを関数に分解し、コンテンツを出力するためのコールバックを提供します。

fs = require 'fs'

processFile = (filename, callback) ->
  fs.readFile filename, (err, contents) ->
    callback contents.toString()

processFile 'COD99000430.TXT', (data) -> console.log data
于 2012-08-17T04:10:37.887 に答える
0

コードを少し変更して、jsfiddle で実行できるようにしました (このマシンにはインストールされていないため、ノードを破棄する必要がありました)。readFile 行を関数に変更し、後で関数を呼び出す必要があると思います。

code = "test"

read = (err, contents) ->
    code = "XZY".toString()

console.log code
alert(code)

code = read()
alert(code)  

グローバル変数は「避けるべき」と見なされます。リンク先のcoffeescriptページには代替手段があります:

他のスクリプトで使用する最上位の変数を作成する場合は、window のプロパティとして、または CommonJS の exports オブジェクトにそれらをアタッチします。存在演算子 (以下で説明) を使用すると、それらを追加する場所を特定する信頼できる方法が得られます。CommonJS とブラウザーの両方をターゲットにしている場合: exports ? これ

于 2012-08-16T22:58:37.183 に答える