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

时间:2017-03-13 10:33:29

标签: 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 = 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;
    };

2 个答案:

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