递归承诺不返回预期值

时间:2016-11-18 13:31:49

标签: javascript jquery ajax recursion

稍作修改,我试图在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);
        });
    });
});

1 个答案:

答案 0 :(得分:0)

如果没有手头的调试工具,我猜想“requestUsername”返回的“requestUnused()”的返回值是与“.done”竞争的“.then”。我相信“.done”和“.then”也有类似的用途。如果要保持模块化方法,将函数分离,可以在外部的“.then”中定义函数,并完全删除“requestUsername”。然后(没有双关语)直接在“requestUnused”中调用“request”,应用之前在“.click”函数中提取的“.then”功能,而不是“.done”。

或者,您可以在点击功能中调用“requestUnused()”而不使用“.done”。