2014-11-24 2 views
0

읽을 수있는 스트림을 만드는 코드가 있습니다. getStream 메서드에서 스트림의 이름을 설정하고 싶습니다. 나는 아래와 같이 속성을 설정하려고 시도했다. onceFunction에서 속성에 액세스 할 수 있지만지도의 속성에서 속성에 액세스 할 수 없습니다. 내가 뭘 잘못하고 있는지 알려주지.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

감사합니다. 작동합니다. 이것이 올바른 방법인가요? –

답변

1

"es"는 "this"를 가지고 있기 때문에. 그리고 es.map 콜백으로 전달합니다. 여기서, ofcource, nodeName은 비어 있습니다. 리팩터링 (closure)을 사용하고 "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); 
     })); 
}