2016-02-29 321 views
0

我对node.js比较陌生,遇到一个函数返回undefined的问题。我使用console.log来确保它返回适当的值,它确实如此。但在调用该函数的脚本中显示为未定义。我认为这可能是一个异步编程的问题?我正在努力学习更多关于promise如何在node.js中工作的内容。我究竟做错了什么?函数返回undefined

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

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

可能重复[为什么我的未来值现在不可用?](http://stackoverflow.com/questions/34959257/why-isnt-my-future-value-available-now) – 2016-02-29 16:13:48

+1

这不是一个节点问题。这是一个JS问题。 – 2016-02-29 16:14:21

回答

1

你可以这样做:

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

,然后调用它像这样:

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

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

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

}; 
+0

我该如何解决? – Grim

+0

您想用'name'参数(传递给回调函数)进行的计算必须在回调本身中完成。 –

+0

您可以返回回调或承诺并获取名称参数值吗? – Grim