Я пытаюсь использовать метод 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()
?
Вместо false
вы можете инициализировать их как неудачные обещания:
var reference1Post = $.Deferred().reject().promise();
var reference2Post = $.Deferred().reject().promise();
var reference3Post = $.Deferred().reject().promise();
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 в качестве разрешенного может работать, я думаю. Это довольно интересная идея, имхо
Используя ответы Вика и А. Вольфа, это был конечный результат:
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');
});
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.
Виноват! ;)
$.when.apply($, arrayOfReferencePost).then(...)
ему только необходимые запросы, а затем использовать:$.when.apply($, arrayOfReferencePost).then(...)