Jquery отложен и возвращает false на основе ответа сервера
У меня есть следующая логика отложенной jquery.
var $qCallA = callA();
var $qCallB = callB();
$.when($qCallA,$qCallB).then(function () {
$("#spinnerDiv").removeClass('spinner show');
});
function callA() {
return $.getJSON("/callA", function (data) {
if (data.status === "success") {
buildTable1(data);
}
});
}
function callB() {
return $.getJSON("/callB", function (data) {
if (data.status === "success") {
buildTable2(data);
}
});
}
Я хочу вернуть false для вызова $.getJSON на основе ответа от бэкэнда json.
Например, если data.status == "failure", то я хочу вернуть "false" для getJSON.
Как достичь этого?
Спасибо
Ответы
Ответ 1
Вы должны предоставить ответные обратные вызовы then
для $.getJSON
и вернуть пользовательский Deffered
для $.when
для обработки.
Таким образом вы можете вручную разрешить или отклонить на основе данных, которые в JSON.
var $qCallA = callA();
var $qCallB = callB();
$.when($qCallA,$qCallB).then(function (s1, s2) {
$("#spinnerDiv").removeClass('spinner show');
}).fail(function() {
//handle failure
});
function callA() {
return $.getJSON("/callA").then(function (data) {
if (data.status === 'failure') {
return $.Deferred().reject("A: no success");
}
return $.Deferred().resolve(data);
});
}
function callB() {
return $.getJSON("/callB").then(function (data) {
if (data.status === 'success') {
return $.Deferred().resolve(data);
}
return $.Deferred().reject("B: no success");
});
}
Подобный JSFiddle
Ответ 2
Похоже, вы хотите использовать правильные обратные вызовы then
, где вы можете вернуть новое значение результата для обещания:
$.when(callA(), callB()).then(function(a, b) {
$("#spinnerDiv").removeClass('spinner show');
if (a && b) …
});
function callA() {
return $.getJSON("/callA").then(function(data) {
if (data.status === "success") {
buildTable1(data);
}
return data.status != "failure";
});
}
function callB() {
return $.getJSON("/callB").then(function(data) {
if (data.status === "success") {
buildTable2(data);
}
return data.status != "failure";
});
}