Ваша проблема может быть просто описана как наличие двух отдельных будущих условий, которые должны быть выполнены, чтобы выполнить определенное действие. Действие состоит в том, что должен произойти переход «вне», одно из условий состоит в том, что запрос AJAX завершен, а другое условие - в том, что переход «в» завершен. Это то, для чего Promise
очень хорошо подходят.
Идея состоит в том, чтобы создать Promise
для каждого из двух условий и разрешить его при выполнении условия, а затем запустить переход "out", когда оба обещания разрешены:
function forceUpdateCount() {
// Create a promise that gets resolved when the transition has completed
var transitionPromise = new Promise(function(resolve) {
$('.count-body.yellowish').one('transitionend', resolve);
}
startAnimateCounters();
var urlForCount = 'api/Order/GetOrderStatusCount';
// $.ajax() already returns a promise, we'll use that
var requestPromise = $.ajax({
type: 'GET',
url: urlForCount,
success: function (data) {
countmodel.nrOfNewOrders(data.countNewOrders);
countmodel.nrOfInProgress(data.countInProgress);
countmodel.nrOfReadyForPickup(data.countReadyForPickup);
countmodel.nrOfInTransport(data.countInTransport);
countmodel.nrOfCompleted(data.countCompletedOrders);
countmodel.nrOfCancelled(data.countCancelledOrders);
countmodel.lastUpdated(getLastUpdated());
},
error: function (e) {
console.log(e);
},
dataType: "json",
contentType: "application/json"
});
// Wrap both promises with Promise.all() to get a new promise that resolves when both of the wrapped promises have resolved
Promise.all([ transitionPromise, requestPromise ]).then(endAnimateCounters);
}
Мы используем событие transitionend
на одном из анимированных элементов, чтобы сигнализировать о том, что условие перехода «в» выполнено.
Promise.all()
берет список обещаний и возвращает новое обещание, которое разрешается, когда все обещания в списке разрешены. Когда это происходит, выполняется функция обратного вызова, переданная методу then()
, которая в нашем случае является функцией endAnimateCounters
, которую мы переместили из обратного вызова успешного выполнения запроса.
Подробнее о Promise
с: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise