2016-04-20 53 views
0

跟進,以解決逐行讀取文件中的行,如下所述:https://stackoverflow.com/a/16013228/570796如何逐行讀取並檢測eof(文件結束)?


var fs  = require('fs'), 
    readline = require('readline'), 
    instream = fs.createReadStream('/path/to/file'); 

var rl = readline.createInterface(
{ 
    input: instream, 
    terminal: false 
}); 

rl.on('line', function(line) 
{ 
    console.log(line); 
    // if(instream.isEnd()) ... 
}); 

如何檢測,如果我到了文件的結尾?

我知道ReadStreamon('end',() => {/*...*/})上有一個事件但我需要一個解決方案,我可以通過if語句來檢查它。

回答

3

這裏有一個解決方案:

var ended = false; 

instream.on('end',() => { ended = true }); 

rl.on('line', function(line) { 
    if (ended) { 
     //... 

然而,有你實際上並不需要這樣一個合理的機會,你的應用可以有不同的結構。

我不確定line事件是否可以發生在end事件之後。

+0

yhea,兩個異步事件側通過這樣一邊是不適合我一展身手: ) – superhero

+0

爲什麼?這就是Node.js編程的工作原理。 – OrangeDog

+0

所有的Javascript都是在單個線程中執行; Node.js提供事件隊列。當我說我不確定它甚至可能發生時,我的意思是,然而你實施了一個檢查,它總是假的,所以沒有理由擁有它。 – OrangeDog

0

另一個(優雅的)方法可能是實現一個Promise。

您還可以添加一個拒絕(「錯誤在閱讀文件」),掛input.on(「錯誤」)而讀。但它不是100%需要你的問題。

var fs = require('fs'); 
var input = require('fs').createReadStream('./inputFile.txt') 

var promise = new Promise(function(resolve, reject) { 
    var lineReader = require('readline').createInterface({ 
    input: input 
    }); 
    input.on('end',() => { 
    resolve("I reached the end!"); 
    }); 

    lineReader.on('line', (line) => { 
    // DO STH. WITH EACH LINE (IF DESIRED) 
    }); 
}); 

promise.then((resolveResult) => { 
    // DO WHATEVER YOU WANT TO DO AFTER 
} 

有關承諾的更多信息,我會檢查下面的介紹: