2015-10-29 19 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; 
};