我有一个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 变量数据。
答案 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