稍作修改,我试图在jQuery Recursive AJAX Call Promise中使用Bergi提供的代码。在我的情况下,我进行AJAX调用以测试是否已使用用户名。如果它已在使用中,则编写一个新用户名并测试该用户名。一旦我们有一个未使用的用户名,我们就完成了并返回了未使用的用户名。但是,我没有得到预期的回报值。我得到的返回值是未定义的。控制台日志声明:
console.log("Return => " + username);
在从requestUsername函数返回之前,表明我返回了一个好的值,但它没有进入:
requestUnused().done(function(unused_uname)
语句。这是我的代码:
$(document).ready(function() {
function request(query_val) {
// return the AJAX promise
return $.ajax({
url: "/php/is_dup_ad_json.php",
method: 'GET',
dataType: 'json',
data: {
query: query_val, sid: Math.random()
},
});
}
function requestUsername(username) {
console.log("Initial => " + username);
return request(username).then(function(ajax_json){
$.each(ajax_json, function(key, value) {
$.each(value, function(k, v) {
if ((k == "duplicate") && (v > 0)) {
// try again with a different username
var first_initial = fname.substr(0,1);
var surname = lname.substr(0,6);
var idx = v + 1;
var tmpUname = surname + first_initial + idx;
console.log("Temp => " + tmpUname);
return requestUsername(tmpUname);
}
else {
console.log("Return => " + username);
return username;
}
});
});
});
}
function requestUnused(){
var fname = "bugs";
var lname = "bunny";
var first_initial = fname.substr(0,1);
var surname = lname.substr(0,7);
var init_uname = surname + first_initial;
return requestUsername(init_uname);
}
$("#test").on('click', function() {
requestUnused().done(function(unused_uname) {
console.log("Done => " + unused_uname);
});
});
});
答案 0 :(得分:0)
如果没有手头的调试工具,我猜想“requestUsername”返回的“requestUnused()”的返回值是与“.done”竞争的“.then”。我相信“.done”和“.then”也有类似的用途。如果要保持模块化方法,将函数分离,可以在外部的“.then”中定义函数,并完全删除“requestUsername”。然后(没有双关语)直接在“requestUnused”中调用“request”,应用之前在“.click”函数中提取的“.then”功能,而不是“.done”。
或者,您可以在点击功能中调用“requestUnused()”而不使用“.done”。