У меня есть ряд асинхронных действий, ответы которых должны быть синхронизированы, чтобы выполнить окончательное действие. Я использую Отложенный объект и , когда() и Молодцы() методы для достижения этой цели, но по какой-то причине, окончательное решение в готовности() всегда выполняется, когда первый решительность() ответов.jQuery.when() не работает как ожидалось
Это код, у меня есть, вырезать немного меньше, чтобы сделать его более ясным:
// Central function that creates a Deferred object and returns a
// Promise from it. when the passed request is done,
// the Deferred is resolved
var getData = function(url, successFunction) {
var deferred = $.Deferred();
$.ajax({
url: url,
method: 'get',
dataType: 'json'
}).done(function(p) {
successFunction(p);
deferred.resolve(p);
}).fail(function(p){
deferred.reject(p);
});
return deferred.promise();
};
// Success actions to be called for each asynchronous request
var populateDestinations = function(data) {
// synchronous actions on DOM
};
var populateTaxes = function(data) {
// synchronous actions on DOM
};
var populatePayment = function(data) {
// synchronous actions on DOM
};
// Actions that return a Promise to control the resolution of
// all the deferred objects
var getCustomerDestinations = function(customerId) {
var url = $modal.data('url_destinations') + customerId;
return getData(url, populateDestinations);
};
var getCustomerTaxes = function(customerId) {
var url = $modal.data('url_taxes') + customerId;
return getData(url, populateTaxes);
};
var getCustomerPayment = function(customerId) {
var url = $modal.data('url_payment') + customerId;
return getData(url, populatePayment);
};
var populateFields = function() {
// final actions
};
$.when(getCustomerDestinations(customer_id),
getCustomerTaxes(customer_id),
getCustomerPayment(customer_id))
.done(function(){
populateFields();
});
populateFields() вызывается всякий раз, когда один из «обещанных» функций решена, а не когда все из них разрешены.
Любая идея, что я делаю неправильно? Возможно, я еще не понял концепцию объекта «Отсрочка».
Вы не хватает закрывающая скобка в важных местах. Добавьте их (покажите нам код, который не является синтаксической ошибкой). – Bergi
Избегайте [отложенного антипаттера] (http://stackoverflow.com/q/23803743/1048572)! Это должно быть просто 'function getData (url, fn) {return $.getJSON (URL) .then (п); } ' – Bergi
На самом деле вам не нужно создавать отложенный объект, чтобы получить обещание, вместо этого просто верните' $ .ajax() ', который по умолчанию возвращает объект обещания. поэтому удалите все отложенные объекты и просто вернитесь из '$ .ajax()' – dreamweiver