Поток событий nodejs, устанавливающий переменную для каждого потока

У меня есть код, который создает читаемый поток. Я хотел бы установить имя потока в методе getStream. Я попытался установить свойство, как показано ниже. Я могу получить доступ к свойству в функции OnceFunction, но не могу получить доступ к свойству в функции карты. Дайте мне знать, что я делаю не так

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);

        }));
}

1 ответ

Решение

Потому что "эс" имеет свое "это". И передает его в обратный вызов es.map. Где, ofcource, имя_узла пусто. Рефакторинг кода для использования замыканий и избегания использования "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);
        }));
}
Другие вопросы по тегам