#javascript #jquery #asynchronous #async-await
Вопрос:
Я загружаю файл и анализирую его на javascript. Когда разбор закончен, я загружаю обработанные результаты на сервер.
Проблема в том, что синтаксический анализ не заканчивается до запуска ajax, даже при использовании асинхронного/ожидания в процедуре синтаксического анализа.
Код:
$(`[name="Submit"]`).on(`click`, async (e)=> {
console.log(`getting file`);
e.stopPropagation();
e.preventDefault();
file = $(`[name="one"]`)[0].files[0];
newData=await parseCSV(file,/t/);
console.log(newData)
return; //let's just end it here for now to see if newData actually has data;
formData=new FormData();
formData.append('one', new File([new Blob([newData])], 't.csv'));
console.log(`launching ajax`);
return;
$.ajax({
url: `taxupl_popup.asp`,
data: form_data,
cache: false,
contentType: false,
processData: false,
enctype: `multipart/form-data`,
type: `POST`,
}).done(function(data) {
console.log(`data`, data);
}).fail(function(xhr, textStatus, errorThrown) {
console.log(xhr, textStatus, errorThrown);
}).always(function() {
//clearInterval(updateStatusTimer);
});
});
async function parseCSV(file, delim) {
let retString;
let validStates=[`AA`]; //,`AL`,`CA`,`WA`,`CO`,`IL`,`LA`,`MI`,`NV`,`OH`,`OK`,`TN`,`TX`];
var regexReplace = new RegExp(delim, "g");
console.log(`reading file`);
var reader = new FileReader();
reader.onload = function(e) {
var rows = e.target.result.split("rn");
const rowCount=rows.length;
//console.log(`rows:`, rowCount);
let curRow=-1;
rows.some(function(r) {
curRow ;
if (validStates.indexOf(r.split(delim)[1])>-1||curRow===0) {
retString =(r.replace(regexReplace,`,`) `rn`);
}
if (curRow===100||curRow===rowCount) {
console.log(`got our data`);
return true;
}
});
};
return new Promise(function(resolve, reject) {
reader.readAsText(file);
resolve(retString);
});
}
Комментарии:
1. поскольку вы не ждете запуска onload,
reader.readAsText(file);
запускающего загрузку, он не будет ждать асинхронного кода. Решение должно быть вызвано при загрузке