2011-10-31 35 views
4

新手問題。爲什麼這個JavaScript函數返回undefined?node/redis中的JavaScript控制流:從回調中返回?

var redis = require("redis"), client = redis.createClient(); 
function generatePageUrl() { 
    var randomStr = randomInt.toString(32); 
    // Check whether this URL is already in our database; 
    client.smembers("url:" + randomStr, function (err, data) { 
     if (data.length != 0) { 
      // URL already in use, try again 
      return getPageUrl(); 
     } 
     return randomStr; 
    }); 
} 
var page_url = generatePageUrl(); 
// add it to the database, etc 

我猜它一定是到結束並返回它達到client.smembers內部之前。

但是我真的需要在返回之前檢查Redis集的內容:我可以從回調中返回它嗎?如果不是,我該怎麼辦?

此外,在我用這個函數遞歸會受到歡迎的方式建議 - 我不知道它是完全合理的:)

感謝您的幫助了新人。

回答

2

您不能從回調中返回。像這樣做:

var redis = require("redis"), client = redis.createClient(); 
function generatePageUrl(cb) { 
    var randomStr = randomInt.toString(32); 
    // Check whether this URL is already in our database; 
    client.smembers("url:" + randomStr, function (err, data) { 
     if (data.length != 0) { 
      // URL already in use, try again 
      getPageUrl(cb); 
     } 
     cb(randomStr); 
    }); 
} 
generatePageUrl(function(page_url){ 
    // add it to the database, etc 
}); 

如果你不喜歡這種風格,你可能要考慮streamlinejs - 它使你能夠編寫你這樣的代碼:

var redis = require("redis"), client = redis.createClient(); 
function generatePageUrl(_) { 
    var randomStr = randomInt.toString(32); 
    // Check whether this URL is already in our database; 
    var data = client.smembers("url:" + randomStr, _); 
    if (data.length != 0) { 
     // URL already in use, try again 
     return getPageUrl(_); 
    } 
    return randomStr; 
} 
var page_url = generatePageUrl(_); 
// add it to the database, etc 
+0

哎呀,忘了一個下劃線, 修復。 – thejh

+0

我用了第一個答案 - 謝謝。逐漸讓我的頭在這個東西! – Richard