返回从NodeJS监听器派生的值
我有一个函数内的NodeJS readstream监听器,我试图让我的函数返回一个从监听器中派生的值(文件的内容)。
例如:
MyObj.prototype.read = function(){ var file3 = fs.createReadStream('test.txt',{encoding:'utf8'}); var contentRead =''; file3.addListener('data',function(data){ contentRead + = data.toString('utf-8'); 返回contentRead; }); }
我想要做一些像var contents = myDerivedObj.read()来返回文件的内容。
但是,从监听器内部的返回没有得到正确的返回 – 得到“未定义”。 而且,从监听器外部返回只是返回一个空string。
我不能改变read()的签名,所以我不能添加一个callback作为参数。
一般来说,这是一个糟糕的模式:当你做这样的事情时,NodeJS真的真的不喜欢它,因为你阻塞了主线程。 你会发现你的performance真的很糟糕。 所以不要这样做。 但是,如果你必须那么你可以试试这个:
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是对的,我错了。 我只是testing了这一点,虽然我认为callback将工作,整个节点进程locking。 做这个:
MyObj.prototype.read = function(){ return fs.readFileSync('test.txt', 'utf-8'); }