2017-10-08 87 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) 
}