0

我的页面上有一个表格。当用户点击发送按钮时,它还会在后台通过调用生成此号码的函数来生成一个 unique_number,并在数据库中检查该号码不存在;如果有 - 再次生成,如果没有 - 返回这个数字。但是,由于某种原因,当我试图将这个数字打印到页面上或提醒它时 - 我得到了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;
        }
    });
}

我确实得到了结果,如果它是真的 - 它会生成新的数字,如果是假的 - 应该返回。我尝试alertelse部分中的数字,它确实提醒了数字,但返回时 - 未定义。为什么会发生以及如何解决?

4

1 回答 1

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

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

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

于 2013-06-13T09:11:16.007 回答