The jQuery docs strongly urge you not to set async
to false
when performing an $.ajax
request.
However, I'm seeing common solutions to synchronicity problems involve doing just this. And then I've seen people been chastised for going against the docs' recommendation.
With that said, I have attempted to use a promise to avoid using async:false
with no luck.
Here is the code I'm using. I have an onclick event that calls addToOrder
:
function saveTemplate() {
var formData = getFormData();
return $.ajax({
type: "POST",
url: "/p/session/save/" + sessionid + "/template/<?php echo $templateID ?>/",
data: formData,
async: true,
success: function(msg){
var rsp = $.parseJSON(msg);
if (rsp.response === 'Saved') {
sessionid = rsp.sessionid;
$("#save-preview-data-response").html(" " + rsp.response).fadeIn(100).delay(1000).fadeOut(1000);
} else {
$("#save-preview-data-response").css('color','#ff0000').html(" " + rsp.response).fadeIn(100).delay(1000).fadeOut(1000);
}
}
});
}
function addToOrder() {
var saved = saveTemplate();
var issaved;
saved.success(function(e) {
var rsp = $.parseJSON(e);
issaved = (rsp.response == 'Saved') ? true : false;
});
if(issaved) {
$.ajax({
type: "POST",
url: "<?php echo $baseURL; ?>addToOrder/respond/json",
data: "sid=" + sessionid,
async: true,
success: function(msg){
var rsp = $.parseJSON(msg);
if (rsp.response === 'Saved') {
alert(msg);
}
}
});
}
}
issaved
will always evaluate to false, as it is being evaluated before saveTemplate
has had time to run. The only solution I have found is to set async:false
but I am taking the warnings I've seen serious and would rather not. What other solutions are there?