2017-04-21 64 views
2

我正在查看nodejs readline模塊文檔,其中我必須逐行讀取非常大的文件,並且它看起來不錯。但對於我的特定任務,我需要它同步讀取行,即。無論什麼時候,5號線不得線4之前,並且由於節點的性質看,我只是想確認,它是此代碼安全的那種用法 -以同步方式逐行讀取文件流

const readline = require('readline'); 
const fs = require('fs'); 

const rl = readline.createInterface({ 
    input: fs.createReadStream('sample.txt') 
}); 

rl.on('line', (line) => { 
    console.log(`Line from file: ${line}`); 
}); 

如果不是這樣,我應該怎麼用/做?目前它正在爲我工​​作,但我不知道它是否會與大行可以解析比以前更快的下一行等。

+0

我試過[this](https://repl.it/HTbf/1),一切似乎都很好。嘗試在你的最後一樣的東西,看看你是否可以使用'var sleep = require('sleep');'並用'sleep.msleep(500 * Math.random());'替換'sleep'函數。也許把你的程序的輸出傳給第二個文件,然後「比較」它們。 – Winestone

回答

1

我非常懷疑這是可能的,回調被解僱以後可以比另一個更早執行。 基本上,它指的是event loop和堆棧的過程。

儘管如此,爲了保證我可以建議實現類似於async/queue的東西,但能夠動態地推送回調。

假設你有這樣的事情:

const Queue = require('./my-queue') 
const queue = new Queue() 

function addLineToQueue(line) { 
    queue.push(function() { 
    // do some job with line 
    console.log(`Line: "${line}" was successfully processed!`) 
    }) 
} 

您將修改代碼:

rl.on('line', (line) => { 
    addLineToQueue(line) 
    console.log(`Added line to queue: ${line}`) 
}) 

並確保您的隊列實現,因爲它有任何任務執行應盡開始。這樣回調的順序將得到保證。但就我而言,它看起來像一個小小的開銷。

+1

但如果第4行在第3行之前被提取,那麼訂單在您的隊列中仍然是「1 2 4 3」。 –

+0

不是不可能的,這些行將被直接逐一提取。他們可以被洗牌的唯一方法是 - 一些原因非常長的同步回調執行,和下一個線路抽水。這是我建議推動他們排隊的原因。內部隊列實現可以在子進程中啓動任務,所以我們永遠不會阻塞時間和洗牌。 – Lazyexpert