javascript - Jquery $.Deferred 不传递参数

标签 javascript jquery ajax

我需要结合三种方法:

  1. 用于检查代码是否存在的 AJAX
  2. 如果代码存在,确认是否覆盖
  3. 覆盖

为了将它们与 .done() 链接在一起,我编写了三个返回 $.Deferred 的方法,如下所示:

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. 您尝试在 $.ajax() 调用的 success 处理程序中的异步函数内部使用 return

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

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

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();
}

关于javascript - Jquery $.Deferred 不传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31726668/

相关文章:

Javascript 函数可以记录并显示弹出警报吗?

ruby-on-rails - 在rails应用程序中发送AJAX Post Jquery

javascript - 使用 MongoDB 限制字段中值的数量

javascript - 在 Firefox 扩展中使用 javascript 和 jQuery 从一个页面下载多个文件

jquery - 使用 jQuery 将高度设置为 iframe 后滚动问题

javascript - jQuery 计算输入的内容

javascript - 如何在javascript中为下拉列表编写回发事件

javascript - 使用 ng-repeat 将按不同类别排序的所有项目打印到行中

javascript - ionicModal 与用于关闭的 Angular ui 模式事件

javascript - jQuery DataTables 单元格样式