【问题标题】:JavaScript control flow in node/redis: returning from inside callback?node/redis 中的 JavaScript 控制流:从内部回调返回?
【发布时间】:2011-12-18 22:32:31
【问题描述】:

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

此外,欢迎对我递归使用此函数的方式提出建议 - 我不确定这是否完全明智 :)

感谢您帮助新人。

【问题讨论】:

    标签: javascript node.js redis


    【解决方案1】:

    您不能从回调内部返回。这样做:

    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
    

    【讨论】:

    • 哎呀,忘了一个下划线,修好了。
    • 我使用了第一个答案 - 谢谢。逐渐了解这些东西!
    猜你喜欢
    • 2023-04-05
    • 2011-12-19
    • 1970-01-01
    • 2017-02-19
    • 2011-06-30
    • 2018-02-07
    • 1970-01-01
    • 2020-08-13
    • 2013-06-22
    相关资源
    最近更新 更多