Индекс массива возвращается неопределенным после pu sh - Papa Parse - PullRequest
0 голосов
/ 22 апреля 2020

Я использовал 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();

1 Ответ

0 голосов
/ 22 апреля 2020

Так как обратный вызов Papa parse complete вызывается асинхронно, вам нужно дождаться его завершения - однако, похоже, что parse 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);
            }
        );
    });
}

, которая возвращает обещание, которое разрешается переданным данным на полный обратный вызов

Вашему коду также нужно дождаться обещания, возвращенного getData, прежде чем он сможет использовать что-либо в этих данных. Если ваш код не находится внутри другой функции async, вам нужно будет использовать метод обещания .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
});

, если, однако, вы вызываете getData внутри функции async - вместе с изменениями getData выше, вы можете просто использовать await getData() для ожидания значения - то есть

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