0

对人好点。我是菜鸟,这是我的第一个 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 中,当我在那里运行它时,独立于脚本的其余部分,它可以完美运行!

任何线索

  1. 如果第一次工作正常,为什么循环可能会在第二次迭代中中断?
  2. 为什么此代码可能在代码段中有效,但在我的脚本中无效?
  3. 我能做些什么来解决这个问题?

提前致谢!

根据评论中的要求,这里有更多来自脚本的代码,以显示在每次迭代中如何处理数据:

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.");
    }
}
4

0 回答 0