2016-02-29 247 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