#jquery #ajax #promise #jquery-animate #fadein
Вопрос:
Я пытаюсь понять, как я могу пройтись по очереди animation_ и дождаться завершения предыдущей, прежде чем начнется следующая.
В настоящее время происходит что-то вроде этого (но на самом деле аквард ..):
let animation_queue = [];
function button_state(form, state) {
animation_queue.push(state);
var box = $(form).find('.btn_state_box');
animation_queue.reduce(function(prev, curr, _){
return prev.then(function() {
animation_queue.shift();
return box.find("[class*='btn__state__']").fadeOut(500, function(){
return box.find("[class*='btn__state__" curr "']").fadeIn(500)
}).promise()
});
}, $.when());
}
Итак, основная идея этого заключается в том, что я получаю разные состояния из запроса ajax и хочу показать их в кнопке с приятной анимацией. Иногда я получаю более быстрый ответ, иногда медленный, но он всегда должен заканчивать анимацию, прежде чем начинать следующую.
Комментарии:
1. Вы уверены, что выражение вашего
box.find(...).fadeOut(500, function() {return box.find(...).fadeIn(500);}).promise()
лица возвращает обещание, которого вы ожидаете? Интересноbox.find(...).fadeOut(500).promise().then(() => box.find(...).fadeIn(500).promise())
, может ли быть больше шансов?2. @Roamer-1888 Я попробую 🙂 спасибо, приятель
3. Я думаю, что вам также нужно будет поднять
inProgress
флаг, когда идет сокращение, и опустить его, когда сокращение будет завершено. Добавьте в очередь безоговорочно, но начинайте новое сокращение только в том случае, если флажок снят.4. @Странник-1888 этого: animation_queue.метод reduce(функция(пред, Карр, ){ возвращение пред.затем(функция() { вернуть шкатулку.найти(«[класс*=’БТН__государства,_ ‘]»).затухание(500).обещание().затем(() => { animation_queue. shift(); поле возврата.найти(«[класс*=’btn__состояние__» curr «‘]»).fadeIn(500) }).обещание() }); }, $.когда()); Наконец, делает то, что я хочу сделать. Спасибо!