对人好点。我是菜鸟,这是我的第一个 SO 问题...
这是我脚本中的一些 JS 代码:
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();
当我在较大的脚本中运行它时,我没有得到所需的输出。相反,脚本中断并且页面只是重新加载。调试器(Chrome 开发工具)向我展示了循环的第一次迭代完全按照我想要的方式执行。但是一旦在第二个fr.readAsText(file);
文件上执行,一切都会中断。
更令人兴奋的是,我将确切的代码行复制到了一个全新的 Snippet 中,当我在那里运行它时,独立于脚本的其余部分,它可以完美运行!
任何线索
- 如果第一次工作正常,为什么循环可能会在第二次迭代中中断?
- 为什么此代码可能在代码段中有效,但在我的脚本中无效?
- 我能做些什么来解决这个问题?
提前致谢!
根据评论中的要求,这里有更多来自脚本的代码,以显示在每次迭代中如何处理数据:
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.");
}
}