从JavaScript承诺回调主体外部访问数据时出错

时间:2018-03-21 05:19:39

标签: javascript protractor

我有一个javaScript方法,它返回从Excel工作表读取数据并将其返回到数组中的承诺。

/* Get Column Data and return */
this.getColumnData = function(FileName,SheetName,ColumnName)
{
    var ColumnDataList = new Array();
    var workbook = new Excel.Workbook(); 
    return workbook.xlsx.readFile(FileName).then(function() {
            var worksheet = workbook.getWorksheet(SheetName);
            for(var v=2;v<=worksheet.actualRowCount;v++)
            {
                ColumnDataList.push(worksheet.getCell(ColumnName+v).value);
            }
          return ColumnDataList;
        });     
};

现在在实现JS回调时,我试图将返回的数组分配给变量并进一步使用它,如下所示:

var tmp = [];
    it('Search TC#1 - ISBN ', function(){ 
        xlReader.getColumnData('Test_Data.xlsx','Sheet1','A').then(function(dataList) {
            tmp=dataList;
            console.log('Inner Data : '+tmp);
            });
        console.log('Outer Data : '+tmp);
        });

当我在var tmp 中分配返回值时,可以从promise回调体内部访问此tmp值,但不能从外部访问。所以它打印的结果是:

外部数据:

内部数据:9781405342704,9780241186091,9780241340189

正如您所看到的,当从JS promise回调的外部调用时它什么都不返回,而我想从promise回调体的外部访问 tmp 变量数据。

1 个答案:

答案 0 :(得分:1)

tmp 可以在外部访问,因为它在词法范围内,但由于promise是异步运行的,所以在解释器到达时

console.log('Outer Data : '+tmp);

tmp尚未填充。

将所有异步逻辑放在.then中,或改为使用await

it('Search TC#1 - ISBN ',  async function() {
  const dataList = await xlReader.getColumnData('Test_Data.xlsx','Sheet1','A');
  // do stuff with dataList