我需要结合三种方法:
- 用于检查代码是否存在的 AJAX
- 如果代码存在,确认是否覆盖
- 覆盖
为了将它们与 .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()。
我做错了什么?
杰森
最佳答案
简而言之:很多。
您尝试在
$.ajax()
调用的success
处理程序中的异步函数内部使用return
。在这里,您传递函数调用的结果,而不是函数的引用作为回调:
checkFunction().done(confirmFunction(codeExists)).done(saveFunction());
这应该更像这样:
checkFunction().done(confirmFunction).done(saveFunction);
在
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/