【问题标题】:Recursive promise not returning expected value递归承诺不返回预期值
【发布时间】:2017-04-02 09:11:49
【问题描述】:

稍作修改,我尝试使用 Bergi 在jQuery Recursive AJAX Call Promise 中提供的代码。就我而言,我进行 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);
        });
    });
});

【问题讨论】:

  • “如果它已经在使用,则编写一个新的用户名并测试那个。一旦我们有一个未使用的用户名,我们就完成并返回那个未使用的用户名。” - 这不是一个好策略。让服务器找出一个未使用的用户名并通过初始 Ajax 调用返回该用户名。不要为这个用例创建一个无休止地来回发送 Ajax 的系统,这很愚蠢。
  • 呃,插入$.each 不仅仅是“轻微修改”。特别是因为您的 then 回调不再有 return 任何东西。
  • 你能发一个ajax_json的例子吗?目前还不清楚这些循环有什么用处。
  • ajax_json 示例:[{"duplicate":1}]

标签: javascript jquery ajax recursion


【解决方案1】:

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

或者,您可以在没有“.done”的点击函数中简单地调用“requestUnused()”。

【讨论】:

  • 不幸的是,我对“.then”的理解与您的理解不同,所以我不明白,“在外部定义“.then”中的函数并完全删除“requestUsername”” .另外,当您说没有“.done”的替代调用“requestUnused()”时,您的意思是如下调用吗? requestUnused(function(unused_uname) {
  • @BrianG 不,我的意思只是 requestUnused() 作为一个电话。
  • @BrianG 通过“外部”,我的意思是 .then - .then(function(...){...}) 中的函数,所以从“function”到它结束的整个部分,即封闭大括号 @987654324 @。该函数可以自己定义,例如myFunction = function(...[cut and paste that code...]}。然后,您可以在任何地方调用myFunction(appropriate variable),包括作为.then 中的回调。但听起来你可能需要更多的练习来学习首先考虑这些函数的返回值。
猜你喜欢
  • 2018-10-11
  • 2014-11-24
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 2018-11-07
相关资源
最近更新 更多