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