Be nice. I'm a noob and this is my first SO question...
Here is some JS code from my script:
let outputArr = [];
let flNum = 0;
let unrecognizedFiles = 0;
async function readFiles() {
const inputFiles = Array.from(pluFolderInput.files);
for (const file of inputFiles) {
flNum++
const fileData = await new Promise((resolve, reject) => {
const fr = new FileReader();
fr.onload = () => {console.log(`completed ${file.name}.`)
resolve(fr.result)
};
fr.onloadstart = () => { console.log(`started ${file.name}.`) };
fr.onerror = () => {
reject("Failed to read file! " + fr.error);
};
fr.readAsText(file);
});
if (!fileData.startsWith("ISA*")) {
unrecognizedFiles++;
return;
};
};
};
readFiles();
When I run it in the larger script I do not get the desired output. Instead, the script breaks and the page just reloads.
The debugger (Chrome dev tools) shows me that the first iteration of the loop performs exactly how I want it to. But as soon as fr.readAsText(file);
is executed on the second file everything breaks.
What's more exciting is that I copied the exact lines of code into a brand new Snippet, and when I run it there, independent of the rest of the script, it works perfectly!
Any clues as to
- Why a loop might break on the second iteration if the first works fine?
- Why this code might work in the Snippet, but not in my script?
- What I can do to hunt down the problem?
Thanks in advance!
As requested in the comments, here is more of the code from the script to show how the data is handled in each iteration:
pluCrunchBtn.addEventListener('click', addPymtFilesToLog);
async function addPymtFilesToLog() {
document.querySelector("#plu-loader").classList.add("is-active");
const flCount = pluFolderInput.files.length;
let svcsAdded = 0;
let svcsUpdated = 0;
let svcsUnchanged = 0;
let flNum = 0;
let clmCount = 0;
let unrecognizedFiles = 0;
const inputFiles = Array.from(pluFolderInput.files);
for (const file of inputFiles) {
flNum++
const fileData = await new Promise((resolve, reject) => {
const fr = new FileReader();
fr.onload = () => {
console.log("reading started.")
resolve(fr.result)
};
fr.onloadstart = () => { console.log("reading started.") };
fr.onerror = () => {
reject("Failed to read file!\n\n" + fr.error);
};
fr.readAsText(file);
});
if (!fileData.startsWith("ISA*")) {
unrecognizedFiles++;
return;
}
const splitFile = fileData.split("~");
const payer = splitFile.find(el => el.includes("N1*PR")).split("\*")[2];
const clinic = splitFile.find(el => el.includes("N1*PE")).split("\*")[2];
const fileDateString = splitFile.find(el => el.includes("BPR")).split("\*")[16];
const fileDate = fileDateString.slice(0, 4) + "-" + fileDateString.slice(4, 6) + "-" + fileDateString.slice(6);
const fileClaims = (fileData.split("CLP")).slice(1);
clmCount += fileClaims.length;
fileClaims.forEach(cl => {
let svcs = cl.split("SVC");
const claimInfo = svcs[0].split("~");
const claimPymtInfo = claimInfo[0].split("\*");
const claimNum = claimPymtInfo[1];
const claimAmtClmd = claimPymtInfo[3];
const claimAmtPaid = claimPymtInfo[4];
const claimPatInfo = claimInfo.find(el => el.includes("NM1*QC")).split("\*");
const claimPatLN = claimPatInfo[3];
const claimPatFN = claimPatInfo[4];
const claimPatIdCodeQlfr = claimPatInfo[8];
const claimPatIdCode = claimPatInfo[9];
svcs = svcs.slice(1);
svcs.forEach(svc => {
const svcPymtInfo = svc.split("~").find(el => el.includes("*HC:")).split("\*")
const svcProcCode = svcPymtInfo[1].split("\:")[1];
const svcSubmtdAmt = svcPymtInfo[2];
const svcAmtPaid = svcPymtInfo[3];
const svcDateRaw = svc.split("~").find(el => el.includes("DTM*472")).split("\*")[2];
const svcDate = svcDateRaw.slice(0, 4) + "-" + svcDateRaw.slice(4, 6) + "-" + svcDateRaw.slice(6);
const svcCtrlNum = svc.split("~").find(el => /REF\*6R\*/.test(el)).split("\*")[2]; //
const svcAdjsmtLine = svc.split("~").find(el => el.includes("CAS*")).split("\*");
const svcAdjmntGroupCode = svcAdjsmtLine[1];
const svcAdjmntReasonCode = svcAdjsmtLine[2];
const svcAdjmntAmt = svcAdjsmtLine[3];
let svcItem = {
'SvcDate': svcDate,
'PatLN': claimPatLN,
'PatFN': claimPatFN,
'SvcProcCode': svcProcCode,
'AmtSbmtd': svcSubmtdAmt,
'AmtPaid': svcAmtPaid,
'AmtAdjstd': svcAdjmntAmt,
'AdjsmtGrpCode': svcAdjmntGroupCode,
'AdjsmtRsnCode': svcAdjmntReasonCode,
'Payer': payer,
'ClaimNum': claimNum,
'ClaimAmt': claimAmtClmd,
'ClaimAmtPaid': claimAmtPaid,
'PatIDQlfr': claimPatIdCodeQlfr,
'PatID': claimPatIdCode,
'SvcCtrlNum': svcCtrlNum,
'Clinic': clinic,
'FileDate': fileDate,
'FileName': file.name,
'Note': ""
}
if (!newLogFile) {
const matchedSvcLineIndex = csvData.findIndex(itm => {
return itm.ClaimNum === claimNum && itm.SvcCtrlNum === svcCtrlNum;
});
if (matchedSvcLineIndex !== -1 && csvData[matchedSvcLineIndex].FileDate < fileDate) {
const oldFileName = csvData[matchedSvcLineIndex].FileDate
svcItem.Note = "Updated. Last file: " + oldFileName;
csvData[matchedSvcLineIndex] = svcItem;
svcsUpdated++;
}
else if (matchedSvcLineIndex !== -1) {
// Else if exists--but not newer...
svcsUnchanged++;
}
else {
csvData.push(svcItem);
svcsAdded++;
}
}
else {
csvData.push(svcItem);
svcsAdded++;
}
if (Array.from(pluFolderInput.files).indexOf(file) + 1 === flCount && fileClaims.indexOf(cl) + 1 === fileClaims.length && svcs.indexOf(svc) + 1 === svcs.length) {
csvData.sort((a, b) => (a.SvcDate > b.SvcDate) ? 1 : ((b.SvcDate > a.SvcDate) ? -1 : 0));
const date = new Date();
const dtStamp = new Date(date.getTime() - date.getTimezoneOffset() * 60000).toISOString().substring(0, 16).replace("T", "_").replace(":", "");
document.querySelector("#plu-loader").classList.remove("is-active");
if (confirm("Files processed: " + flCount +
"\nClaims processed: " + clmCount +
"\nServices Added: " + svcsAdded +
"\nServices Updated: " + svcsUpdated +
"\nServices Unchanged: " + svcsUnchanged +
"\n\nClick 'Ok' to download the new log file.")) {
generateDownload("PaymentLog_" + dtStamp + ".csv", Papa.unparse(csvData));
};
}
})
})
};
if (unrecognizedFiles > 0) {
confirm("NOTE: " + unrecognizedFiles + " (of " + flCount + ") files in the selected folder were not recognized as valid payment files.");
}
}