我试图解析一个JSON样本,并将各个对象推送到一个数组中。我遇到的问题是,我认为它是工作的,但当调用 console.log
打印结果,它返回一个 undefined
价值。我相信这是因为我没有处理好我的。async/await
请求,但我不知道怎样才能不运行这个 console.log
函数,直到所有元素都被推送到我的数组中。
Attacks.js
//Assume JSON output = {attack source, attack destination, attack type}
//Required modules
//@ts-ignore: undeclared module
//const watchStream = require('fs-watch-stream')
const es = require('event-stream')
var JSONStream = require('JSONStream')
const fs = require('fs');
async function initial(){
var arr = [];
var stream = fs.createReadStream('sample.json', {start: 3, encoding: 'utf8'});
var parser = JSONStream.parse('employees.employee.*');
stream.pipe(parser);
parser.on('data', function (obj) {
arr.push(obj);
});
parser.on('finish', async function(arr) {
return(arr) = await Promise.resolve(arr);
});
};
initial().then(arr => console.log(arr));
示例.json
{
"employees": {
"employee": [
{
"id": "1",
"firstName": "Tom",
"lastName": "Cruise",
"photo": "https://jsonformatter.org/img/tom-cruise.jpg"
},
{
"id": "2",
"firstName": "Maria",
"lastName": "Sharapova",
"photo": "https://jsonformatter.org/img/Maria-Sharapova.jpg"
},
{
"id": "3",
"firstName": "Robert",
"lastName": "Downey Jr.",
"photo": "https://jsonformatter.org/img/Robert-Downey-Jr.jpg"
}
]
}
}
问题出在这部分。
parser.on('finish', async function(arr) {
return(arr) = await Promise.resolve(arr);
});
当... finish
事件被触发时,回调函数 function(arr)
被调用,但由于它是一个函数,任何的 return
里面的语句不会被 initial()
它是由 function(arr)
而没有为它分配任何变量,所以在 return(arr)
是迷路了。你在期待 initial()
决心 arr
但由于 return arr
语句已经在 function(arr)
丢失,而且由于 initial
没有任何 return
语句,最后它解析为 undefined
. 我认为在这种情况下,比较简单的方法是采用经典的承诺流。
function initial(){
return new Promise(resolve => {
var arr = [];
var stream = fs.createReadStream('sample.json', {start: 3, encoding: 'utf8'});
var parser = JSONStream.parse('employees.employee.*');
stream.pipe(parser);
parser.on('data', function (obj) {
arr.push(obj);
});
parser.on('finish', function(arr) {
resolve(arr);
});
})
};
initial().then(arr => console.log(arr));
下面的代码简单地定义了一个事件处理程序;你的 initial
函数不会等待委托人执行,更不用说完成了。
parser.on('finish', async function(arr) {
return(arr) = await Promise.resolve(arr);
});
你应该用一个 Promise
,可以通过以下方式等待 initial
:
await Promise(resolve => parser.on("finish", resolve));