首页 文章

函数返回undefined [重复]

提问于
浏览
0

这个问题在这里已有答案:

我是node.js的新手,我遇到了一个函数返回未定义的问题 . 我使用console.log来确保它返回正确的值,它确实 . 但是在调用函数的脚本中显示为undefined . 我认为这可能是异步编程的问题?我想了解更多有关promises如何在node.js中工作的信息 . 我究竟做错了什么?

我认为这是异步问题的原因是因为console.log在getCurrentFrameName();中的console.log之前未定义打印到控制台 . var name被指定为undefined .

frameHandler.switchToFrame('top_page');

var name = frameHandler.getCurrentFrameName();

console.log(name);

此方法中的console.log在上面代码中的console.log之后打印到控制台 . 打印到名称控制台的值是top_page .

this.getCurrentFrameName = function()
{
    driver.executeScript('return self.name').then(function(name) {
        console.log(name);
        return name;
    });
};

2 回答

  • 1

    是的,这是异步编程的问题 . 您无法从异步回调中返回值 .

    这是因为回调等待异步脚本执行,因此,节点会立即将控制权传递给回调后的下一行 .

    在您的情况下, console.log(name); 在执行回调之前被调用 . 因此, undefined .


    对当前情况最简单的解决方案是在回调本身内执行必要的计算 .

    但是,在更复杂的情况下(例如回调中的回调),您可以很容易地得到所谓的callback hell .

    有几种方法可以处理回调地狱:其中一种叫做Promise .

    Promise本质上做的是它为代码带来线性感,从而使其更容易理解和维护 .

    在您的情况下,您可以这样做:

    this.getCurrentFrameName = function() {
    
        var myPromise = driver.executeScript('return self.name');
    
        myPromise.then(function(name) {
            // Do all computation with `name` here
        });
    
    };
    
  • 0

    你可以这样做:

    this.getCurrentFrameName = function(callback) {
        driver.executeScript('return self.name').then(function(name) {
            return callback(name);
        });
    };
    

    然后像这样调用它:

    frameHandler.getCurrentFrameName(function(name) {
        console.log(name);
    });
    

    这将解决您的问题,但是,是同步问题 .

相关问题