Urządzenie zdecydowanie zaleca, aby nie ustawiać async
na false
podczas wykonywania żądania $.ajax
.Taktyka, aby uniknąć używania async: false z jQuery?
Jednak często spotykam się z problemem solutions w związku z problemami synchronizacji związanymi z robieniem tego. A potem widziałem ludzi, którzy byli chastised za niezgodne z zaleceniem doktorów.
Powiedziawszy to, próbowałem użyć promise, aby uniknąć używania async:false
bez powodzenia.
Oto kod, którego używam. Mam zdarzenie onclick, który wywołuje 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
zawsze będzie oceniać na false, ponieważ jest oceniany przed saveTemplate
miał czas do uruchomienia. Jedyne rozwiązanie, jakie znalazłem, to ustawić async:false
, ale biorę ostrzeżenia, które widziałem poważnie i wolę nie. Jakie są inne rozwiązania?
Tak, właśnie to próbowałem powiedzieć: pobiłeś mnie, pisząc kod, ale prawie się pomyliłem, nie zauważając, że twoje Zrób coś w drugim przykładzie było zaakceptowaniem callback jako funkcja; ;-) – Chris
Świetne wyjaśnienie i odpowiedź. Dzięki :) – Nick