打印查询时,它只是打印"未定义"但是我需要从excel中获取值来打印。
this.getQuery = function(excelpath, sheetName, queryName) {
var query;
var workbook = new path.Workbook()
workbook.xlsx.readFile(excelpath)
.then(function(){
var sheet = workbook.getWorksheet(sheetName)
var rowsize=sheet.rowCount
for(i=1;i<rowsize;i++){
var Row = sheet.getRow(i)
var qName = Row.getCell(1).value
if(qName==queryName){
query=Row.getCell(2).value
break;
}
}
})
return query;
};
答案 0 :(得分:0)
在您提供给query
的回调被执行之前,您没有设置then
的值,这实际上是在 {{1}之后的行。从文件中读取可能需要不可忽视的时间,并且您使用的方法不会在此期间阻止调用堆栈,因此后续指令仍将在此期间执行,您的函数将运行完成,在回调代码开始之前返回return query
。
如果您正在使用异步方法来读取文件,则需要编写一个异步函数来使用它并返回结果 - 通过返回undefined
或者接听并调用回调。 / p>
这是一个很好的资源来解释如何以及为什么:https://www.pluralsight.com/guides/front-end-javascript/introduction-to-asynchronous-javascript
答案 1 :(得分:0)
在解除query
的承诺之前,会发生异步并返回readFile(excelpath)
。您可以等到Promise被解析并链接return语句或直接返回promise并在测试规范中解析。
方法1 :从已解决的承诺中返回query
值。因此,在您的测试规范中,解析实际值的承诺
this.getQuery = function(excelpath, sheetName, queryName) {
var query;
var workbook = new path.Workbook()
return workbook.xlsx.readFile(excelpath)
.then(function(){
var sheet = workbook.getWorksheet(sheetName)
var rowsize=sheet.rowCount
for(i=1;i<rowsize;i++){
var Row = sheet.getRow(i)
var qName = Row.getCell(1).value
if(qName===queryName){
query=Row.getCell(2).value
return query;
}
}
})
};
方法2:在解决return query
承诺后,将行 - readFile()
链接起来并进行比较。
this.getQuery = function(excelpath, sheetName, queryName) {
var query;
var workbook = new path.Workbook()
workbook.xlsx.readFile(excelpath)
.then(function(){
var sheet = workbook.getWorksheet(sheetName)
var rowsize=sheet.rowCount
for(i=1;i<rowsize;i++){
var Row = sheet.getRow(i)
var qName = Row.getCell(1).value
if(qName===queryName){
query=Row.getCell(2).value
break;
}
}
// Now Chain the logic of returning the value to this then
}).then(function _returnValueOnlyAfterValueAssigned() {
return query;
})
};