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

我试图解析一个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));

给TA打赏
共{{data.count}}人
人已打赏
未分类

如何过滤空通量

2022-9-8 11:55:34

未分类

试图用 pipe() 在两个进程之间进行通信,会破坏程序。

2022-9-8 11:55:36

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索