Jquery $ .Deferred Not Passing Parameters

时间:2015-07-30 14:33:21

标签: javascript jquery ajax

我需要结合三种方法:

  1. 用于检查代码是否存在的AJAX
  2. 如果代码存在,请确认是否覆盖
  3. 覆盖
  4. 我写了三个返回$ .Deferred的方法,以便将它们与.done()链接在一起,如下所示:

    function checkFunction() {
    
        var code = $("#code").val();
    
        return $.ajax({
            url: "${pageContext.request.contextPath}/dataManagement/codeMaintenance/check",
            method: "POST",
            async: false,
            data: {
                "reasonCode": code
            },
            success: function(response, textStatus, jqXHR) {
                var exists = response.dataMap.exists;
                console.log("Code exists: " + exists);
                if (exists == true) {
                    return $.Deferred().resolve(true);
                } else {
                    return $.Deferred().reject();
                }
    
    
            }, error: function() {
                return $.Deferred().reject("AJAX ERROR");
            }
        });
    };
    
    var confirmFunction = function(codeExists) {
    
        console.log("Confirming overwrite");
    
        if (codeExists == true) {
            var confirm = confirm("Code Exists: Do you wish to overwrite?");
            if (confirm == true) {
                return $.Deferred(true);
            } else {
                return $.Deferred(false);
            }
        } else {
            return $.Deferred(true);
        }
    
    };  
    
    var saveFunction = function() {
    
        console.log("Saving");
    
        var code = $("#code").val();
    
        return $.ajax({
                url: "${pageContext.request.contextPath}/dataManagement/codeMaintenance/save",
                method: "POST",
                data: {
                    "reasonCode": code
                },
                success: function(response, textStatus, jqXHR) {
                    alert("test");
                    return $.Deferred(true);
                }
    
            });
    };
    
    然后我尝试通过这一行执行:

    checkFunction().done(confirmFunction(codeExists)).done(saveFunction());
    

    不幸的是,我在第一个方法的$ .Deferred上设置的参数不会作为参数传递给confirmFunction()。

    我做错了什么?

    杰森

1 个答案:

答案 0 :(得分:2)

简而言之:充足。

  1. 您尝试在return来电的success处理程序中使用异步函数内的$.ajax()

  2. 在这里传递函数调用的结果,而不是函数的引用作为回调:
    checkFunction().done(confirmFunction(codeExists)).done(saveFunction());
    这应该更像这样:
    checkFunction().done(confirmFunction).done(saveFunction);

  3. confirmFunction()中,您返回一个新的Deferred对象。您应该做的是创建一个Deferred对象,返回相应的promise,然后解析/拒绝Deferred对象。因此,例如,您的checkFunction()函数应如下所示:

  4. function checkFunction() {
    
        var code = $("#code").val();
    
        // create deferred object
        var result = $.Deferred();
    
        return $.ajax({
            url: "${pageContext.request.contextPath}/dataManagement/codeMaintenance/check",
            method: "POST",
            async: false,
            data: {
                "reasonCode": code
            },
            success: function(response, textStatus, jqXHR) {
                var exists = response.dataMap.exists;
                console.log("Code exists: " + exists);
                if (exists == true) {
                    result.resolve(true);
                } else {
                    result.reject();
                }
    
    
            }, error: function() {
                result.reject("AJAX ERROR");
            }
        });
    
      return result.promise();
    }