【问题标题】:Array index returns undefined after push - Papa Parse推送后数组索引返回未定义 - Papa Parse
【发布时间】:2020-04-21 22:42:57
【问题描述】:

我使用 Papa Parse 解析一个 .csv 文件,并将结果推送到一个名为 parsed_data 的空数组中。我可以使用console.log(parsed_data),并查看生成的数组。但是,当我尝试索引数据时,例如console.log(parsed_data[0]),结果是未定义的。不知道这里出了什么问题。

示例代码:

    let parsed_data = [];
    const data_url = "acdata.csv";
    async function getData() {
        const response = await fetch(data_url);
        const blob = await response.blob();
        const data = Papa.parse(blob, {
            complete: function(results) {
                //console.log("Finished:", results.data);   
                parsed_data.push(results.data); 
            }
        });

    };
    console.log(parsed_data);
    getData();

【问题讨论】:

  • complete 回调被异步调用 - 您可以在 console 中看到结果的原因是因为控制台中的数组在您查看它们时会被计算
  • 你在这里混合了同步和异步代码
  • @JaromandaX 感谢您的回复。大约一周前,我才刚刚开始使用 Javascript。您能否详细说明我需要做什么才能索引 parsed_data 数组?

标签: javascript json csv parsing papaparse


【解决方案1】:

由于 Papa parse complete 回调是异步调用的,您需要等待它完成 - 但是,papa parse 似乎不使用 Promises,因此,您可以像这样“承诺”解析函数

const papaParsePromise = blob => new Promise(resolve => Papa.parse(blob, { complete: resolve }));

如果您不理解 => 表示法,查看该函数的另一种方法是

function papaParsePromise(blob) {
    return new Promise(function(resolve) {
        Papa.parse(blob, { 
            complete: function(data) {
                resolve(data);
            }
        );
    });
}

返回一个promise,解析为传递给完整回调的数据

您的代码还需要等待getData 返回的承诺,然后才能使用该数据中的任何内容。除非您的代码在另一个 async 函数中,否则您需要使用 promise .then 方法,如下所示

const data_url = "acdata.csv";
async function getData() {
    // create a function that returns a Promise that resolves when papa parse complete is called
    const papaParsePromise = blob => new Promise(resolve => Papa.parse(blob, { complete: resolve }));
    const response = await fetch(data_url);
    const blob = await response.blob();
    const data = await papaParsePromise(blob);
    return data;
};
getData()
.then(parse_data => {
    console.log(parsed_data);
    console.log(parsed_data[0]);
    // i.e. do what you need with parsed_data here
});

但是,如果您在 async 函数内调用 getData - 连同上面对 getData 的更改,您可以简单地使用 await getData() 等待值 - 即

async function someFunction() {
    const parsed_data = await getData();
    // do what you need with parsed_data here
}

【讨论】:

  • 谢谢!这很好用。我必须熟悉异步和箭头符号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
  • 2015-10-17
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多