2017-10-08 93 views
0
const fs = require('fs') 
const readline = require('readline') 
const stream = require('stream') 

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

var items = new Set() 

// ASYNC FUNCTION READING LINE BY LINE 

rl.on('line', function(line) { 
    let log = JSON.parse(line) 
    // ADDING ITEMS TO A SET TO GET UNIQUE ITEMS COUNT 
    items.add(log.resource) 
}) 

// PRINTING OUT THE SIZE OF THE SET 
console.log(items.size) 

現在的問題是,當我這樣做時,我總是得到未定義或0的大小的集合,因爲console.log(items.size)甚至在執行所有line函數之前執行。如何在異步函數中做一些同步?

如何解決此問題。

謝謝。

+0

是的,它看起來像有多個異步調用的額外的複雜性可能重複。 –

+0

一個明確的答案會非常感謝,因爲我剛剛開始使用JS,對於我理解鏈接答案中的所有概念有點困難。 – deadpoolAlready

+0

@deadpool把最後一行寫成''rl.on(「end」,function(){/ * here * /})' –

回答

0

正如@str所指出的那樣,Stack Overflow已經有一個非常好的答案,因爲您可能最好的方法是採用異步方法:How do I return the response from an asynchronous call?

對於您的特定問題,我建議您只使用readlineclose事件。

一旦'close'事件發出,readline.Interface實例應該被視爲「完成」。

在你的榜樣,您可以使用以下命令:

// PRINTING OUT THE SIZE OF THE SET 
rl.on('close', function() { 
    console.log(items.size) 
}