2

在打印查询时,它只是打印“未定义”,但我需要从 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;
    };
4

2 回答 2

0

query在执行您提供的回调之前,您不会设置的值then,这实际上是在该行之后return query的时间。从文件读取可能会花费不可忽略的时间,并且您使用的方法不会在此期间阻塞调用堆栈,因此后续指令仍将同时执行,您的函数将运行完成,undefined在回调代码开始之前返回。

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

这是一个很好的资源来解释如何以及为什么:https ://www.pluralsight.com/guides/front-end-javascript/introduction-to-asynchronous-javascript

于 2017-03-13T10:57:42.143 回答
0

它发生异步并query在 promise ofreadFile(excelpath)解决之前返回。您可以等到 Promise 解决并链接 return 语句或直接返回 Promise 并在测试规范中解决。

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

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;
    })
};
于 2017-03-13T11:01:24.607 回答