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

新手问题.为什么这个
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集的内容:我可以让它从回调内部返回吗?如果没有,我该怎么办?

另外,关于我递归使用这个函数的方式的建议会受到欢迎 – 我不确定这是完全合理的:)

感谢您帮助新人.

最佳答案 你无法从回调中返回.像这样做:

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
点赞