如何在javascript中更改全局变量值并返回相同的值

如何在javascript中更改全局变量值并返回相同的值,javascript,protractor,exceljs,Javascript,Protractor,Exceljs,在打印查询时,它只是打印“未定义”,但我需要打印从excel获取的值 this.getQuery = function(excelpath, sheetName, queryName) { var query; var workbook = new path.Workbook() workbook.xlsx.readFile(excelpath) .then(function(){ var sheet = w

在打印查询时,它只是打印“未定义”,但我需要打印从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;
    };
this.getQuery=函数(excelpath、sheetName、queryName){
var查询;
var工作簿=新路径。工作簿()
workbook.xlsx.readFile(excelpath)
.然后(函数(){
var sheet=workbook.getWorksheet(sheetName)
var rowsize=sheet.rowCount

对于(i=1;i您不会设置
query
的值,直到您提供给
然后执行
的回调,这实际上是在
返回查询
行之后执行的。从文件读取可能需要不可忽略的时间,并且您正在使用的方法不会在此期间阻塞调用堆栈,因此后续的指令仍将在此期间执行,函数将运行到完成,在回调代码开始之前返回
未定义的

如果您使用异步方法读取文件,则需要编写一个异步函数来使用它并返回结果-通过返回
Promise
或接受并调用回调


这是一个很好的资源来解释如何和为什么:

在解析
readFile(excelpath)
的承诺之前,它是异步发生的,并且
query
是返回的。您可以等待承诺被解析并链接返回语句,或者直接返回承诺并在测试规范中解析

方法1:从已解析的承诺中返回
查询
值。因此,在测试规范中,将承诺解析为实际值

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

方法1打印为“[object Promise]”。方法2再次打印为“Undefined”。方法1将返回一个承诺,而不是一个值。要从承诺中获取值,需要使用
.then()
方法进行解析。在您的情况下,应该像使用
this.getQuery(“path”,“sheet1”,“somequery”)。然后(函数(returnValueFromgetQueryMethod){console.log(returnValueFromgetQueryMethod);})
您能否用Excel文件的样本内容和样本规范更新问题,您将此方法称为关于方法1的方法-请遵循@Sudharsansevaraj的建议。正如我在回答中所述,有两种方法-1.返回解析为值的承诺,或2.在此处解析承诺,然后链接返回陈述……方法1要求遵循Sudharsan的建议并解决问题promise@AdityaReddy即使是方法2也会返回一个承诺,我们需要使用
then()
显式地解决它。我想使用方法1非常简单和直接。这是否回答了您的问题?
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;
    })
};