2012-03-12 33 views
0

外我在JS此功能:功能範圍的JavaScript,返回的函數

function redGet(key){ 
    var response; 
    red.get(key, function (err, reply) { 
      response = reply; 
     }); 
    return response; 
    } 

這樣可以使返回undefined上:

console.log(redGet("hello")); 
+0

你能解釋一下'red'是什麼? – Blender 2012-03-12 04:29:08

+0

red = redis.createClient(); – re1man 2012-03-12 04:30:01

+0

什麼是'redis.createClient()'?你確定'red.get()'函數是在第一個工作嗎? – Blender 2012-03-12 04:30:37

回答

2

假設red.get()是一個AJAX狀異步函數,所述問題在於你期望它能夠同步運行。在異步操作完成之前,您將無法獲得reply值,這意味着必須在回調函數中調用依賴此值的任何內容。

例如:

function redGet(key){ 
    red.get(key, function (err, reply) { 
     // do whatever you need to do with the reply value here 
     console.log(reply); 
    }); 
} 

redGet("hello"); 
+1

這聽起來是正確的。你將如何去解決這個問題? – Blender 2012-03-12 04:32:41

+0

請參閱我的編輯示例。實際上,使用當前的代碼,您不會從'red.get()'不提供的'redGet()'函數中獲得太多的功能,儘管您可能會使用它來進行一致的錯誤處理。 – nrabinowitz 2012-03-12 04:35:10

0

你不說什麼red是,但最有可能的.get()方法是異步,這意味着redGet()執行與return response此時值立即繼續未定義。只有在.get()完成其處理後,您的回調函數纔會執行以設置response - reply

與任何異步代碼一樣(也可以在Ajax,數據庫訪問等代碼中找到),您可能需要重構代碼,以便在回調函數中執行任何取決於.get()的返回值的函數函數從回調中調用)。

+0

是的。難道我們不能把它標記爲其他數十億的「我如何從這個異步調用返回值」問題的重複嗎? – 2012-03-12 04:34:18

+0

@GGG - 好吧,它有點重複,但如果你明白我的意思,那麼每個不愉快的異步方法都會以自己的方式不高興。如果有一個SO參考頁面,那麼我們就不需要寫這個解釋十億次了。 – nrabinowitz 2012-03-12 04:38:41

+0

我認爲這就是所謂的谷歌;)但主要問題是人們不知道要搜索什麼。如果SO的重複問題邏輯更聰明一點,那會很好。 – Blender 2012-03-12 04:43:16

0

我猜你red.get是一個Ajax函數調用(這是異步)

發生什麼事是你console.log(..)red.get(..)之前得到執行得到的結果回來。

如果你仍然想要它的工作,你必須傳遞一個回調,例如

redGet('hello', function(res) { 
    alert(res) 
}) 

// then in your code 
function redGet(key, cb){ 
    red.get(key, function (err, reply) { 
     cb(reply) 
    }); 
} 
0

您可以使用jquery $ .ajax函數與async:false選項。可能是紅色的變量使用jQuery的$ .ajax函數裏面,你可以做到這一點。但它會影響性能。 關於http://api.jquery.com/jQuery.ajax/的更多信息