node / redis中的JavaScript控制流:从回调内部返回?

时间:2011-10-31 17:44:09

标签: javascript node.js redis

新手问题。为什么这个JavaScript函数返回undefined?

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集的内容:我可以让它从回调内部返回吗?如果没有,我该怎么办?

此外,关于我递归使用此函数的方式的建议将受到欢迎 - 我不确定它是否完全合理:)

感谢您帮助新人。

1 个答案:

答案 0 :(得分: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