我需要结合三种方法:
我写了三个返回$ .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()。
我做错了什么?
杰森
答案 0 :(得分:2)
简而言之:充足。
您尝试在return
来电的success
处理程序中使用异步函数内的$.ajax()
。
在这里传递函数调用的结果,而不是函数的引用作为回调:
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();
}