调用函数返回'undefined'

时间:2013-06-13 08:56:41

标签: javascript ajax json undefined

我的页面上有一个表单。当用户点击发送按钮时,它在后台通过调用生成该号码的函数生成unique_number,并在DB中检查该号码不存在;如果是的话 - 再次生成它,如果没有 - 返回这个数字。但是,由于某些原因,当我尝试将此数字打印到页面或提醒它时 - 我得到undefined,尽管该函数返回了数字。 这是对函数的调用:

var unique_num = create_unique_number();
alert(unique_num);
    rest of this function...

这是函数本身:

function create_unique_number()
{
var num = Math.floor(Math.random() * (999999 - 100000 + 1)) + 100000;

$.getJSON("inc/API.php", 
{
    command:"is_unique_number_exist",
    unique_num:num
},
    function(result){
        if(result==true){
            create_unique_number();
        }
        else
        {
            return num;
        }
    });
}

我确实得到了结果,如果它是真的 - 它会生成新的数字,如果为假 - 应该返回。我尝试alert else部分中的数字,它确实警告了数字,但是在返回时 - 未定义。 为什么会发生这种情况以及如何解决它?

1 个答案:

答案 0 :(得分:1)

对于使用延迟对象的解决方案,请尝试以下方法:

function create_unique_number()
{
    var num = Math.floor(Math.random() * (999999 - 100000 + 1)) + 100000;

    return $.getJSON("inc/API.php", {
        command:"is_unique_number_exist",
        unique_num:num
    }).then(function(result) {
        return result ? create_unique_number() : num;
    });
}

这当然是未经测试的,因为我没有您的API,但理论result true .then调用返回递归调用返回同一函数的结果。如果resultfalse,则会将所选数字作为新承诺的(已解决)结果返回。

如果任何AJAX调用失败,循环应该中断,你可以通过.fail调用捕获它:

create_unique_number().done(function(n) {
    // use your unique number "n" here
    var unique_num = n;
    ...
}).fail(function() {
    // there was an AJAX error
});

// can't use "unique_num" here - execution continues here immediately
// and "unique_num" isn't defined until the above ".done" callback is
// invoked some time later

请注意,递归调用不是真正的递归 - 因为AJAX是事件驱动的,原始函数在AJAX .then事件触发之前很久就已经终止并清理了它的堆栈。对create_unique_number的新调用将与原始调用处于相同的“调用堆栈”级别。

另外,正如评论中所指出的那样,让服务器给你一个随机数实际上要简单得多。