异步返回解析后的JSON数组。

问题描述 投票:0回答:1

我试图解析一个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"
      }
    ]
  }
}
javascript json promise async-await
1个回答
0
投票

问题出在这部分。

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));

0
投票

下面的代码简单地定义了一个事件处理程序;你的 initial 函数不会等待委托人执行,更不用说完成了。

parser.on('finish', async function(arr) {
    return(arr) = await Promise.resolve(arr);
});

你应该用一个 Promise,可以通过以下方式等待 initial:

await Promise(resolve => parser.on("finish", resolve));
© www.soinside.com 2019 - 2024. All rights reserved.