0

Есть код который работает для плавного выполнения некоторой анимации объекта на странице сайта. Обработчик событий сначала просматривает все найденные объекты страницы для анимации и вызывает асинхронную функцию которая осуществляет для объекта из параметра процедуру анимации которая занимает до секунды.

Если удалять обработчик до окончания исполнения всех анимационных функций на странице при резких прокрутках вверх вниз - не всегда конечное состояние будет обработано последним обработчиком который был удален до исполнения анимации. Если же обработчик будет вызван - то асинхронные функции бегут в параллель и объект при прокрутках вверх/вниз начинает моргать - так как параллельно два обработчика будут менять его состояние.

Необходимо синхронизировать этот процесс и одним из способов является принудительная остановка работы асинхронной функции уже запущенной для прежнего состояния и продолжение выполнения только последней. Не могу найти такой способ - буду благодарен за советы. Так же с удовольствием выслушаю возможности других решений. Алекс

  • 3
    Отличное описание! Теперь не хватает примера кода, который бы воспроизводил проблему. – Stepan Kasyanenko Jun 18 '19 at 05:30
  • А зачем код? Проблема воспроизводится при любом коде который в асинхронной функции выполняется достаточно времени, чтобы следующий вызов этой же функции успел стартовать. – Alexander Malyshev Jun 18 '19 at 06:46
  • Способы реализации могут быть различными. Решение проблемы зависит от реализации. Следовательно, нужен ваш код. – Stepan Kasyanenko Jun 18 '19 at 07:32
  • JS - однопоточный, если не рассматривать webworker или serviceworker. Вы можете привести ссылку, что таких событий всегда идет несколько подряд, особенно скроллинг, и все обработчики бегут в своем потоке**? – Stepan Kasyanenko Jun 18 '19 at 11:31
  • Я не могу объяснить разницу между потоком и процессом, человеку в 300 символьном комментарии. В асинхронных функциях создается контент и отложенный вызов, фактически поток, который будет вызываться в тот момент когда надо, чтобы создать параллельное исполнение асинк фу-ий. Все это разумеется будет в одном процессе, но при этом у каждой функции будет своя область данных. В моем случае переключение контента происходит в момент вызова await когда фактически процесс переключается на другую фу-ию, пока текущая в ожидании. – Alexander Malyshev Jun 18 '19 at 11:41
  • Да, у меня тоже не получается довести до вас мысль, что все ваши отложенные функции и обработчики событий выполняются в одном потоке. Они не могут исполняться паралелльно! И я не просил вас объяснять в комментарии, я просил привести ссылку, потому что я не могу найти в гугле того, чего нет) – Stepan Kasyanenko Jun 18 '19 at 12:18
  • @AlexanderMalyshev день добрый.
    1. Нужен пример вашего кода, чтобы можно было хоть как-то помочь, сейчас это беспредметный разговор.
    2. js однопоточен.
    3. Не нужно флудить в комментариях. Степан вам же пытается помочь )=
    – Suvitruf - Andrei Apanasik Jun 21 '19 at 04:44
  • Suvitruf
    1. нет не нужен. 2) нет - одно процессный но может и делает многопоточную обработку - если вы конечно понимаете что такое изменение контента 3) нет не пытается - он пытается настоять на собственных ошибках Все уже давно решено - на деле есть два пути решения - создание кастомного объекта в текущем объекте html который найден в скрипте и использование одного синхронизационного флага для всех функций. Я использовал второй способ с каунтером уже запущенных функций, перехватчик меняет состояние глоб флага на выход и ждет каунтера 0 дабы запустить асинхронные ф-ии заново.
    – Alexander Malyshev Jun 22 '19 at 06:38
  • @AlexanderMalyshev по-умолчанию никакой многопоточной обработки. Асинхронной - да, многопоточной - нет. Многопоточность возможна только если вы специально создали worker'ы. Думаю, для начала нужно с этим разобраться. – Suvitruf - Andrei Apanasik Jun 25 '19 at 06:32
  • Кстати, отличный ответ в тему про многопточность\асинхронность https://ru.stackoverflow.com/questions/445768/%d0%9c%d0%bd%d0%be%d0%b3%d0%be%d0%bf%d0%be%d1%82%d0%be%d1%87%d0%bd%d0%be%d0%b5-vs-%d0%b0%d1%81%d0%b8%d0%bd%d1%85%d1%80%d0%be%d0%bd%d0%bd%d0%be%d0%b5-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5/416086#416086 – Stepan Kasyanenko Jul 03 '19 at 05:44
  • Степан, следующий ответа я напишу матом - пожалуйста уберите от меня свою персону подальше. Идите читайте что хотите :) – Alexander Malyshev Jul 04 '19 at 16:46

0 Answers0