2016-09-30 4 views
0

私はコールバックを研究していますが、何らかの理由でそれを正しく取得できません... ファイルを読み込み、後で再生するためにデータをグローバル変数に保存します。ここでNodejs readlineコールバック

は、私がこれまで持っているものです。

var fs = require("fs"); 
var readline = require("readline"); 
var i = 0; 
var total = 66; //put the total foldernames or total images (same number) 
var folder_names = []; 
var data = []; 

lineReader = readline.createInterface({ 
    input: fs.createReadStream("folder-names and data.txt") 
}); 


lineReader.on('line', function(line, dataCollector) { 
    if(i<66) 
     folder_names.push(line); 
    else 
     data.push(line); 

    dataCollector(folder_names, data); 
    i++; 
}); 

var dataCollector = function(folder_names, data) { 
    //console.log(folder_names); 
} 

console.log(folder_names[0]); //should have a value now. 

間違っていますか?私が取得:dataCollector is not a function

答えて

3

あなたがここにdataCollector識別子シャドウイングしている:

lineReader.on('line', function(line, dataCollector) { 

(隠し)スクリプトのトップレベルでの識別子をシャドウ、コールバックへの2番目の引数としてdataCollectorを宣言します。

The line event、それは次のようになりますので、そのコールバックのいずれかの第二引数を文書化していない:

lineReader.on('line', function(line) { 

の質問のあなたの延長再:

console.log(folder_names[0]); //should have a value now. 

いいえ、そうしてはいけません。なぜ:あなたのケースではHow do I return the response from an asynchronous call?

が、あなたはおそらく何をしたいあなたのcloseイベントハンドラでconsole.log

lineReader 
    .on('line', function(line) { 
     if(i<66) 
      folder_names.push(line); 
     else 
      data.push(line); 

     dataCollector(folder_names, data); 
     i++; 
    }) 
    .on('close', function() { 
     console.log(folder_names[0]); // has its values now 
    }); 
+0

lineReader関数にfolder_names変数を入力したいとします。私は私の質問を更新します。 –

+0

@FlorinPop:あなたの質問は、なぜ "dataCollectorは関数ではありませんか?"というエラーが出ている理由です。質問は動く標的を意味するものではありません。これはその質問に答えます。 –

+0

私は「私はファイルを読んで、そのデータをグローバル変数に保存して後で再生したいと思っています。 –

0

はあなたがラインに達したときに行われますvarを使用して関数を宣言。したがって、コールバックで呼び出すと、その関数はまだ定義されていません。どちらか、それを使用lineReader.on('line', function(){})または(より良い)の前にそれを移動できるようにするためにそのように定義します。

function dataCollector(folder_names, data) { 
    /* Your function */ 
} 

はこのようにそれをやって、あなたのスクリプトが実行される前に、あなたの関数が宣言され、あなたが到達したときので、それが存在しますあなたのコールバック。

+0

* "関数には、行に達したときに実行されるvarを使用して宣言していますので、コールバックで呼び出すと関数はまだ定義されていません。" *いいえ、間違っていますが、そこ。これは、 'readLine'がコールバック* synchronously *を呼び出した場合にのみ当てはまりますが、そうではありません。問題の順番に物事を置くことは貧弱ですが、 'dataCollector'はコールバックが呼び出されるまでにその値を持ちます。 –

+0

ありがとうございます:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/functionの_Function宣言hoisting_を参照してください。それでも、ここでの問題は指摘されているようなシャドーイングです。 –

+0

*** sigh ***はい、私は関数宣言の仕組みを知っています。私はOPのコードについてあなたが言ったことが間違っていると言っています。それは間違っているからです。私はまた、なぜ、それが間違っているのかを、はっきり言った。 –

関連する問題