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";
    });
}