2014-11-24 44 views
0

我有一個代碼可以創建一個可讀的流。我想在getStream方法中設置流的名稱。我嘗試設置一個屬性,如下所示。我能夠訪問onceFunction中的屬性,但我無法訪問地圖Function中的屬性。讓我知道我做錯了什麼nodejs事件流設置每個流的變量

var onceFunction = function(str1,record) { 
    console.log("OnceFunction",this.nodeName); 
} 
var getStream = function(csvData) { 
    var dirNames = csvData.split("/"); 
    var nodeName = dirNames[dirNames.length-2]; 
    var fileName = csvData; 
    stream = fs.createReadStream(csvData); 
    stream.nodeName = dirNames[dirNames.length-2]; 

    return stream; 
}; 
var myFileList = ["D:\mypath\file"]; 

for (var i = 0; i< myFileList.length; i++) { 
    getStream(myFileList[i]) 
     .once('data',onceFunction) 
     .pipe(es.split()) 
     .on('end',endFunction) 
     .pipe(es.map(function(data,cb) { 
      console.log(this.nodeName); 

     })); 
} 
+0

謝謝。工程。這是做這件事的正確方法嗎? – 2014-11-25 04:24:29

回答

1

因爲「ES」有它自己的「this」。並將其傳遞給es.map回調。其中,ofcource,nodeName是空的。重構代碼以使用閉包,並避免使用「this」。 例如僞代碼:

for (var i = 0; i< myFileList.length; i++) { 
    processFile(myFileList[i]); 
} 

var processfile = function(file) { 
    var stream = getStream(file); 
    var somevar = stream.nodeName; 
    stream.once('data',onceFunction) 
     .pipe(es.split()) 
     .on('end',endFunction) 
     .pipe(es.map(function(data,cb) { 
      console.log(somevar); 
      console.log(stream.nodeName); 
     })); 
}