外我在JS此功能:功能範圍的JavaScript,返回的函數
function redGet(key){
var response;
red.get(key, function (err, reply) {
response = reply;
});
return response;
}
這樣可以使返回undefined上:
console.log(redGet("hello"));
外我在JS此功能:功能範圍的JavaScript,返回的函數
function redGet(key){
var response;
red.get(key, function (err, reply) {
response = reply;
});
return response;
}
這樣可以使返回undefined上:
console.log(redGet("hello"));
假設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");
這聽起來是正確的。你將如何去解決這個問題? – Blender 2012-03-12 04:32:41
請參閱我的編輯示例。實際上,使用當前的代碼,您不會從'red.get()'不提供的'redGet()'函數中獲得太多的功能,儘管您可能會使用它來進行一致的錯誤處理。 – nrabinowitz 2012-03-12 04:35:10
你不說什麼red
是,但最有可能的.get()
方法是異步,這意味着redGet()
執行與return response
此時值立即繼續是未定義。只有在.get()
完成其處理後,您的回調函數纔會執行以設置response - reply
。
與任何異步代碼一樣(也可以在Ajax,數據庫訪問等代碼中找到),您可能需要重構代碼,以便在回調函數中執行任何取決於.get()
的返回值的函數函數從回調中調用)。
是的。難道我們不能把它標記爲其他數十億的「我如何從這個異步調用返回值」問題的重複嗎? – 2012-03-12 04:34:18
@GGG - 好吧,它有點重複,但如果你明白我的意思,那麼每個不愉快的異步方法都會以自己的方式不高興。如果有一個SO參考頁面,那麼我們就不需要寫這個解釋十億次了。 – nrabinowitz 2012-03-12 04:38:41
我認爲這就是所謂的谷歌;)但主要問題是人們不知道要搜索什麼。如果SO的重複問題邏輯更聰明一點,那會很好。 – Blender 2012-03-12 04:43:16
我猜你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)
});
}
您可以使用jquery $ .ajax函數與async:false選項。可能是紅色的變量使用jQuery的$ .ajax函數裏面,你可以做到這一點。但它會影響性能。 關於http://api.jquery.com/jQuery.ajax/的更多信息
你能解釋一下'red'是什麼? – Blender 2012-03-12 04:29:08
red = redis.createClient(); – re1man 2012-03-12 04:30:01
什麼是'redis.createClient()'?你確定'red.get()'函數是在第一個工作嗎? – Blender 2012-03-12 04:30:37