首页 > 解决方案 > 带有被推入对象的数组结果仍然是空的

问题描述

我正在声明一个数组list_of_blogposts,然后我正在打开一个文件以从中提取数据,并在其中声明一个blogpost_object我正在输入键值对的对象。当我在打开的文件代码块内进行控制台记录时,它会正确地进行控制台记录,但在它之外,它显示为空,就像在最后一行中它不起作用一样。任何人都可以提及它的原因和解决方案吗?谢谢,代码如下

const list_of_blogposts = [];

new XLSX()
  .extract("./all_blogposts.xlsx", {
    ignore_header: 2,
    include_empty_rows: false,
    sheet_name: "all_blogposts"
  })
  .on("row", function(row) {
    var blogpost_object = {};
    blogpost_object["title"] = row[2];
    list_of_blogposts.push(blogpost_object);

    console.log(list_of_blogposts);
  });

console.log(list_of_blogposts);

标签: javascriptarrays

解决方案


这是因为它function(row) {...是一个回调函数,因此它是异步执行的。所以执行流程就像

  1. 执行.on()
  2. 在回调中调用函数function(row) {...
  3. 执行console.log外部函数
  4. 最后,回调函数的执行

因此,在console.log调用回调函数之前执行函数外部的函数,因此它返回一个空数组。函数内部console.log在值被推送后返回数组。

因此,您可以做些什么来解决这个问题,就是对回调函数中的值数组做任何您想做的事情。

const doAction = (list) => {
   //Do whatever you want
}

const list_of_blogposts = [];

new XLSX()
  .extract("./all_blogposts.xlsx", {
    ignore_header: 2,
    include_empty_rows: false,
    sheet_name: "all_blogposts"
  })
  .on("row", function(row) {
    var blogpost_object = {};
    blogpost_object["title"] = row[2];
    list_of_blogposts.push(blogpost_object);

    console.log(list_of_blogposts);
    doAction(list_of_blogposts)
  });

console.log(list_of_blogposts);

希望有帮助!!!


推荐阅读