我的页面上有一个表单。当用户点击发送按钮时,它在后台通过调用生成该号码的函数生成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
部分中的数字,它确实警告了数字,但是在返回时 - 未定义。
为什么会发生这种情况以及如何解决它?
答案 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
调用返回递归调用返回同一函数的结果。如果result
为false
,则会将所选数字作为新承诺的(已解决)结果返回。
如果任何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
的新调用将与原始调用处于相同的“调用堆栈”级别。
另外,正如评论中所指出的那样,让服务器给你一个随机数实际上要简单得多。