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

时间:2015-10-29 15:15:08

标签: javascript arrays exceljs

我使用Node 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(例如调用外部函数来填充dataRows数组),在workbook.xslx.readFile()的上下文中创建的任何对象似乎都会被破坏。怪异。

1 个答案:

答案 0 :(得分:3)

workbook.xlsx.readFile是一个异步函数。您正在执行异步之前返回dataRows。

请参阅How do I return the response from an asynchronous call?

以下是使用回调解决此问题的简单方法。将期望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;
};