2016-09-30 71 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) { 

聲明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?

在你的情況,你可能想要做你的console.logclose事件處理程序:

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'同步調用它的回調*,但它不會。按照問題中的順序放置事物是一種不好的做法,但在調用回調時,dataCollector將具有它的值。 –

+0

最初是這樣的:請參閱https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/function中的函數聲明hoisting_。儘管如此,這個問題仍然是指出的陰影。 –

+0

***嘆息***是的,我知道函數聲明如何工作。我在說,你對OP的代碼所說的話是不正確的。因爲這是不正確的。我也很清楚地說*爲什麼*這是不正確的。 –