Возвращение значения, полученного от слушателя NodeJS - PullRequest
1 голос
/ 31 августа 2011

У меня есть прослушиватель потока чтения NodeJS внутри функции, и я пытаюсь заставить мою функцию возвращать значение (содержимое файла), полученное из слушателя.

Например:

MyObj.prototype.read = function(){  

    var file3 = fs.createReadStream('test.txt', {encoding: 'utf8'});            
    var contentRead = '';       

    file3.addListener('data', function(data) {   
      contentRead += data.toString('utf-8');    
      return contentRead;            
    });
}

Я хотел бы сделать что-то вроде var contents = myDerivedObj.read (), чтобы вернуть содержимое файла.

Однако, возвращение из слушателя не возвращается правильно - получение 'не определено.И, возвращаясь извне, слушатель просто возвращает пустую строку.

Я не могу изменить сигнатуру read (), поэтому я не могу добавить обратный вызов в качестве аргумента.

1 Ответ

2 голосов
/ 31 августа 2011

В общем, это плохой шаблон: NodeJS REALLY REALLY REALLY не нравится, когда вы делаете такие вещи, потому что вы блокируете основной поток.Вы обнаружите, что ваше выступление действительно сосет.Так что не делай этого.Но если вы ДОЛЖНЫ, тогда вы можете попробовать это:

MyObj.prototype.read = function(){  

    var file3 = fs.createReadStream('test.txt', {encoding: 'utf8'});            
    var contentRead = '';       
    var done = false;

    file3.addListener('data', function(data) {   
      contentRead += data.toString('utf-8');    
    });

    file3.addListener("end", function () {
       done = true;
     });

    while(!done);
    return contentRead;
}

РЕДАКТИРОВАТЬ: @ Брэндон прав, а я не прав.Я только что проверил это, и хотя я думал, что обратные вызовы будут работать, весь процесс узла блокируется.Сделайте это:

MyObj.prototype.read = function(){      
        return fs.readFileSync('test.txt', 'utf-8');
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...