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

Javascript数组内容在离开函数上下文后消失,javascript,arrays,exceljs,Javascript,Arrays,Exceljs,我正在使用节点npm库“ExcelJS”读取Excel工作簿的工作表,并用表示工作表行中的数据的对象填充数组 我不认为这个问题与ExcelJS有直接关系,可能是因为我对Javascript函数上下文缺乏基本的理解 守则: getData = function () { var dataRows = []; workbook.xlsx.readFile("myExcelWorkbook").then(function () { var worksheet = wo

我正在使用节点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()上下文中创建的任何对象都会在之后被销毁。奇怪。

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

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

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

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

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

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

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

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