2015-10-29 20 views
0

我使用Node npm库“ExcelJS”读取Excel工作簿的工作表,并使用表示数据表行中找到的数据的对象填充数组。在离开函数上下文后,Javascript数组内容消失

我不认为这个问题与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; 
}; 

如果我调试通过上面的代码步骤我不能看到正被填充了eachRow功能期间找到正确的数据的数据行对象。但是,一旦退出“readFile”函数,填充到dataRows对象中的所有项目就会消失。无论我如何尝试填充dataRows(例如,调用外部函数来填充dataRows数组),在workbook.xslx.readFile()的上下文中创建的任何对象似乎在之后都会被销毁。奇怪的。

回答

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; 
};