【发布时间】:2017-01-08 16:37:12
【问题描述】:
我在让 node 的异步特性与我合作时遇到了一些问题,并且在经过数小时的回调和谷歌搜索之后;我终于转向你们了。
我有一个程序需要使用 node 的 readline 模块从文件中读取行。该文件包含传递给我的节点程序中定义的一些异步函数的数据。一旦所有数据被成功读取和处理后,需要将这些数据解析成JSON格式,然后输出。
我的问题是,当我调用:readLine.on('close', function() { ...... } 时,这是在异步函数完成运行之前运行的,因此我没有任何输出,但程序继续运行异步函数。
我创建了一个简单的函数框架,可以更清楚地解释我的情况:
function firstAsyncFunc(dataFromFile) {
//do something asynchronously
return processedData;
}
function secondAsyncFunc(dataFromFile) {
//do something else asynchronously
return processedData;
}
//create readline
var lineReader = require('readline').createInterface({
input: require('fs').createReadStream('data.txt')
});
//array to hold all the data processed
var totalDataStorage;
//read file
lineReader.on('line', function(line) {
var processedData = firstAsyncFunction(line);
var moreProcessedData = secondAsyncFunction(line);
//store processed data and concatenate into one array
var tempDataStorage = [{ 'first': processedData, 'second': moreProcessedData }]
totalDataStorage = totalDataStorage.concat(tempDataStorage);
}).on('close', function() {
var JSONString = JSON.stringify(... //create JSON for totalDataStorage ...);
console.log(JSONString); //DOESN'T OUTPUT ANYTHING!
});
我尝试向 first/secondAsynFunction 添加回调,我尝试使程序的读取和解析位分开函数,并创建回调以便仅在读取完成时调用解析,但这些解决方案都没有似乎正在工作,我真的很挣扎 - 所以任何帮助将不胜感激。
谢谢!
编辑:data.txt 文件的格式为
IPData1 DataCenter1
IPData2 DataCenter2
...
IPDataN DataCenterN
我使用 str.split(" ") 来获取各自的值,然后适当地传递它们。 IPData 是数字,DataCenter 是字符串
【问题讨论】:
-
可以分享一下data.txt文件吗?我相信我可以回答你
-
@JaromandaX 再次查看 OP 的代码。它是一个数组,而不是字符串。
-
data.txt 文件的格式为:
IPData, DataCentre。在实际程序中,我使用 str.split(" ") 来拆分两个值,然后将它们传递给必要的函数。 IPData 是一个数字,DataCentre 值是一个字符串。希望这会有所帮助 -
@OliverOstach 您的代码中有很多错误。您需要意识到,每次调用异步函数时,它都不会返回值,并且您还需要传递一个回调函数。你的行
var processedData = firstAsyncFunction(line);完全没有意义。此外,使用fs.readFile可以在几行中轻松完成。 -
啊我忘了提到异步函数返回值!准确地说是字符串值!我现在会编辑它
标签: javascript node.js asynchronous readline synchronous