Папа разбора выходит из строя - PullRequest
0 голосов
/ 25 мая 2018

С помощью PapaParse я анализирую CSV-файл, который затем добавляю в переменные dataShort и dataTotal.Я могу регистрировать как dataShort, так и dataTotal внутри всей функции, но не под ней.Я полагаю, это происходит из-за того, что функция выполняется асинхронно.

В результате этого следующие функции (changeData и dataReady) не могут быть запущены успешно, так как они требуют, чтобы Para Parse был выполнен с разбором.Как я могу сделать changeData ();в функции parseCSV запускаться только после завершения вышеуказанного анализа?

function parseCSV(evt) {
    var file = evt.target.files[0];

    Papa.parse(file, {
        header: true,
        dynamicTyping: true,
        complete: function (results) {
            dataShort = results.data;
            dataTotal = results.data;
            console.log(results.data);
            console.log("dataShort: " + dataShort);
            console.log("dataTotal: " + dataTotal);
        }
    });
    console.log("dataShort: " + dataShort);
    console.log("dataTotal: " + dataTotal);
    
    changeData();
}



function changeData() {
    $.each(dataShort, function (index, item) {

        if (item["Items in CHILDoc"].length > 20) {
            item["Items in CHILDoc"] = item["Items in CHILDoc"].substring(0, 18) + "...";
        }
        if (item["Kwadrant onderdeel in CHILDoc"] != "Ingrijpende gebeurtenissen" && item["Waarde in CHILDoc"].length > 20) {
            item["Waarde in CHILDoc"] = item["Waarde in CHILDoc"].substring(0, 15) + "...";
        }
    })
    //            console.log(dataShort);
    //            console.log(dataTotal);
    dataReady();
}

1 Ответ

0 голосов
/ 25 мая 2018

Вы правы в том, что он работает асинхронно.Вы можете напрямую вызвать функцию changeData из функции события complete.Попробуйте что-то вроде этого:

function parseCSV(evt) {
  var file = evt.target.files[0];
  Papa.parse(file, {
    header: true,
    dynamicTyping: true,
    complete: function(results) {
      dataTotal = results.data;
      dataShort = results.data;
      changeData(dataShort);       
    }
  });
}

function changeData(var ds) {
  $.each(ds, function(index, item) {
    if (item["Items in CHILDoc"].length > 20) {
      item["Items in CHILDoc"] = item["Items in CHILDoc"].substring(0, 18) + "...";
    }
    if (item["Kwadrant onderdeel in CHILDoc"] != "Ingrijpende gebeurtenissen" && item["Waarde in CHILDoc"].length > 20) {
      item["Waarde in CHILDoc"] = item["Waarde in CHILDoc"].substring(0, 15) + "...";
    }
  });
  dataReady();
}

Здесь я изменил функцию changeData, чтобы она принимала данные результата и вызывала их из функции complete. Обратите внимание, что я удаляю переменные dataShort и dataTotal, поскольку здесь я их не вижу, но возвращаю их обратно, если вы используете их где-то в вашем коде.

Редактировать: dataShorts изменяется после вызова функции changeData, но dataTotal все равно будет иметь исходный результат.Я предполагаю, что вы объявляете переменные dataShort и dataTotal где-то сверху.

...