函数返回undefined

时间:2016-02-29 15:31:40

标签: javascript

我是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 个答案:

答案 0 :(得分:1)

你可以这样做:

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

然后像这样调用它:

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

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

答案 1 :(得分:0)

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

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

在您的情况下,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
    });

};