Переменная по умолчанию для неудачного запроса AJAX в Javascript

0

Я пытаюсь использовать метод jQuery .when для запуска запроса ajax после успешного выполнения нескольких других запросов, и каждый из этих запросов является необязательным. Если он не запущен, я не хочу выдавать окончательный запрос ajax. Это то, что у меня есть до сих пор:

var reference1 = ko.contextFor(document.getElementById("reference1")).$data;
var reference2 = ko.contextFor(document.getElementById("reference2")).$data;
var reference3 = ko.contextFor(document.getElementById("reference3")).$data;

var reference1Post = false;
var reference2Post = false;
var reference3Post = false;

if (reference1.isValid()) {
    reference1Post = reference1.save();
};

if (reference2.isValid()) {
    reference2Post = reference2.save();
};

if (reference3.isValid()) {
    reference3Post = reference3.save();
};

$.when(reference1Post, reference2Post, reference3Post).then(function () {
    alert('save acct');
}, function () {
    alert('failure');
});

Однако это приводит к тому, что маршрут успеха запускается. Похоже, мне нужно по умолчанию запрашивать неудавшийся запрос и добиваться успеха только в том случае, если он работает, и это успешно. Могу ли я сделать эту работу, используя .when()?

  • 0
    Вместо этого вы можете использовать массив и $.when.apply($, arrayOfReferencePost).then(...) ему только необходимые запросы, а затем использовать: $.when.apply($, arrayOfReferencePost).then(...)
  • 0
    Да, но выполнение этого не приведет к сбою метода .when (), если необязательный запрос не вызывается.
Показать ещё 1 комментарий
Теги:

2 ответа

1
Лучший ответ

Вместо false вы можете инициализировать их как неудачные обещания:

var reference1Post = $.Deferred().reject().promise();
var reference2Post = $.Deferred().reject().promise();
var reference3Post = $.Deferred().reject().promise();
  • 0
    Из DOC: The method will resolve its master Deferred as soon as all the Deferreds resolve, or reject the master Deferred as soon as one of the Deferreds is rejected. Но теперь установка необязательного deferred в качестве разрешенного может работать, я думаю. Это довольно интересная идея, имхо
1

Используя ответы Вика и А. Вольфа, это был конечный результат:

var reference1 = ko.contextFor(document.getElementById("reference1")).$data;
var reference2 = ko.contextFor(document.getElementById("reference2")).$data;
var reference3 = ko.contextFor(document.getElementById("reference3")).$data;

var requests = [];

if (reference1.isValid()) {
    requests.push(reference1.save());
} else {
    requests.push($.Deferred().reject().promise());
};

if (reference2.isValid()) {
    requests.push(reference2.save());
} else {
    requests.push($.Deferred().reject().promise());
};

if (reference3.isValid()) {
    requests.push(reference3.save());
} else {
    requests.push($.Deferred().reject().promise());
};

$.when.apply($, requests).then(function () {
    alert('save acct');
}, function () {
    alert('failure');
});
  • 0
    Хорошо, я пропустил эту часть вашего вопроса: However, this causes the success route to trigger. It seems like I need to default the requests to a failed request and have it set to success only if it runs and it successful. Виноват! ;)
  • 0
    Не волнуйтесь. Я понятия не имею, о чем я говорю в этой области, поэтому я, вероятно, не очень хорошо описал это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню