Как справиться с состоянием гонки с анимацией в javascript

У меня есть кнопка, при нажатии на которую я исчезаю элемент пользовательского интерфейса, выполняю обработку для получения некоторых данных, а затем повторно отображаю этот элемент пользовательского интерфейса на основе полученных данных. Проблема здесь в том, что между анимацией и получением данных мы не можем быть уверены, какая часть будет завершена первой. Итак, скажем, если анимация fadeOut завершена первой, мне нужно подождать, пока я не получу необходимые данные, или, скажем, я сначала получу данные, а затем я должен дождаться завершения анимации. Прямо сейчас я обрабатываю это, вызывая общую функцию, которая сначала проверяет, выполняются ли оба условия, и если какое-либо из них не выполняется, она возвращается.
Мой псевдокод -

onButtonClick() {
    doSomeServiceCall(); //The data will be received in an already registered callback which I cant change.
    startFadeOutAnimation(commonFunction) //commonFunction is invoked on completion of animation
}

callBackFunctionToRecevieDataFromService (data) {
    var receivedData = data;
    if (animationStillGoingOn) {
        return;
    }
    else {
        commonFunction();
    }
}


commonFunction() {
      if (receivedData == null || AnimationNotCompletedYet)
          return;
      performReRenderOfUIComponent; //re-rendering of ui element
}

Это решение работает, но мне оно не нравится, потому что оно довольно хакерское и его трудно понять кому-то другому. Чтобы сделать его чище, я подумал об использовании обещаний javascript, но не похоже, что обещания помогут, или, может быть, я не могу придумать подход, который использует обещания. Может ли быть какой-нибудь более чистый подход к кодированию этого в javascript?

Псевдокода недостаточно, чтобы действительно знать, что можно исправить или как на самом деле могут применяться промисы. Поскольку ваш вопрос сейчас, я бы закрыл его как слишком широкий.

zer00ne 19.02.2019 12:31

@ zer00ne, на самом деле ничего не исправить. Это решение работает, но я ищу более чистые подходы. Я могу ошибаться, но я думаю, что любая добавленная дополнительная информация сделает вопрос излишне длинным.

Ryan Gusto 19.02.2019 13:20

Ваш вопрос - это игра в угадайку, а не сломанный код (это то, к чему обращается SO). Вам нужно опубликовать на codereview.stackexchange.com реальный рабочий код.

zer00ne 19.02.2019 13:28
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
126
1

Ответы 1

Промисы БУДУТ помогать при управлении асинхронными функциями. Вы должны вернуть обещание из обеих функций, а затем выполнить их параллельно, используя Promise.all()

var p1 = Promise.resolve(3);
var p2 = 1337;
var p3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, "foo");
}); 

Promise.all([p1, p2, p3]).then(values => { 
  console.info(values); // [3, 1337, "foo"] 
});

ссылка: https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

Другие вопросы по теме