Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 返回从NodeJS侦听器派生的值_Javascript_Node.js_Closures - Fatal编程技术网

Javascript 返回从NodeJS侦听器派生的值

Javascript 返回从NodeJS侦听器派生的值,javascript,node.js,closures,Javascript,Node.js,Closures,我在一个函数中有一个NodeJS readstream监听器,我试图让我的函数返回一个从监听器中派生的值(文件内容) e、 g: MyObj.prototype.read = function(){ var file3 = fs.createReadStream('test.txt', {encoding: 'utf8'}); var contentRead = ''; file3.addListener('data', fu

我在一个函数中有一个NodeJS readstream监听器,我试图让我的函数返回一个从监听器中派生的值(文件内容)

e、 g:

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; }); } MyObj.prototype.read=函数(){ var file3=fs.createReadStream('test.txt',{encoding:'utf8'}); var contentRead=''; file3.addListener('data',函数(data){ contentRead+=data.toString('utf-8'); 返回contentRead; }); } 我想做一些类似var contents=myDerivedObj.read()的操作来返回文件的内容

但是,监听器内部的返回没有正确返回-返回“undefined”。并且,从监听器外部返回只返回一个空字符串


我无法更改read()的签名,因此无法添加回调作为参数。

一般来说,这是一种糟糕的模式:当您执行类似操作时,NodeJS确实不喜欢这样做,因为您阻塞了主线程。你会发现你的表现真的很差劲。所以不要这样做。但如果必须这样做,您可以尝试以下方法:

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;
}
编辑:@Brandon是对的,而我错了。我刚刚测试了这个,虽然我认为回调可以工作,但是整个节点进程都被锁定了。这样做:

MyObj.prototype.read = function(){      
        return fs.readFileSync('test.txt', 'utf-8');
    }

那么,在不使用回调和修改方法签名的情况下,这种情况下的首选模式是什么?+1。节点的全部要点是异步I/O,编写这样的阻塞代码与它的原理完全相反。Node有几个同步读取数据的文件系统方法(例如,
readFileSync
),主要用于在不需要异步I/O的程序启动期间读取小型配置文件。否则,您应该真正尝试采用Node的异步模型(或使用另一种更适合的技术)。@Bamerza Femi可能有其他想法,但在Node中,您自己的所有代码(您自己编写的代码)都在单个线程中执行。因此,如果没有回调,就无法处理I/O和其他异步调用,如果使用阻塞调用,Node.js应用程序将完全锁定,直到从磁盘读取整个文件。这就是说,如果你绝对必须这样做,那么Femi提供的代码就会起作用;另外,正如我提到的,Node提供了它的文件系统方法,所以您可以读取文件并返回它。@Brandon:创建一个答案,我将删除我的答案。