离开函数上下文后,Javascript数组内容将消失

Javascript array contents disappear after leaving function context

本文关键字:消失 数组 Javascript 函数 上下文 离开      更新时间:2023-09-26

我正在使用节点npm库"ExcelJS"读取Excel工作簿的工作表,并用表示工作表行中数据的对象填充数组。

我不认为这个问题与ExcelJS有直接关系,可能是因为我根本不了解Javascript函数上下文。

代码:

getData = function () {
    var dataRows = [];
    workbook.xlsx.readFile("myExcelWorkbook").then(function () {
        var worksheet = workbook.getWorksheet("MyWorksheet");
        worksheet.eachRow(function (row) {
            var dataRow = {
                colA: row.getCell("A").value,
                colB: row.getCell("B").value,
                colC: row.getCell("C").value
            };
            dataRows.push(dataRow);
        });
    });
    return dataRows;
};

如果我通过上面的代码调试步骤,我可以看到dataRows对象在哪里填充了在eachRow函数中找到的正确数据。然而,一旦退出"readFile"函数,填充到dataRows对象中的所有项目就会消失。

无论我如何尝试填充dataRows(例如,调用外部函数来填充dataRow数组),在工作簿.xslx.readFile()的上下文中创建的任何对象都会在之后被销毁。奇怪的

工作簿.xlsx.readFile是一个异步函数。您将在异步执行之前返回dataRows。

请参阅如何从异步调用返回响应?

以下是使用回调修复此问题的简单方法。将期望dataRows输出的函数传递给getData,然后在构建dataRows后调用它。同样,使用关联问题中解释的承诺有更好的解决方案。

getData = function (callback) {
    var dataRows = [];
    workbook.xlsx.readFile("myExcelWorkbook").then(function () {
        var worksheet = workbook.getWorksheet("MyWorksheet");
        worksheet.eachRow(function (row) {
            var dataRow = {
                colA: row.getCell("A").value,
                colB: row.getCell("B").value,
                colC: row.getCell("C").value
            };
            dataRows.push(dataRow);
        });
        callback(dataRows);
    });
    return dataRows;
};