Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.11.2021, 11:53
Интересующийся
Отправить личное сообщение для JobLack Посмотреть профиль Найти все сообщения от JobLack
 
Регистрация: 08.06.2017
Сообщений: 24

Подвисает браузер на "тяжелой" задаче.
Друзья, подскажите, пожалуйста.
Какой правильно подход использовать для разбиения "тяжелой" процедуры на подзадачи, как везде советуют . В таком коде браузер зависает с сообщением "окно не отвечает ...Подождать?"
...Promise.then((...) => {
// всякие преобразования... долго выполняемый код
})
Идеально на экран выдавать прогрессбар...но, как я понимаю, рендер будет ждать окончания "тяжелого" кода и потом что-то нарисует.
Спасибо.

Последний раз редактировалось JobLack, 17.11.2021 в 11:57.
Ответить с цитированием
  #2 (permalink)  
Старый 17.11.2021, 13:17
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,138

Сообщение от JobLack
Какой правильно подход использовать для разбиения "тяжелой" процедуры
Я такое просто "стартую" и сразу возвращаю некую "ссылку/ключ".
Потом с некой периодичностью опрашиваю сервер с этой "ссылкой/ключем" и получаю ответ типа "готово или нет" и "на каком этапе"...
Если готово - запрашиваю данные.
Если не готово - как-то отображаю "прогресс" на клиенте...
Ответить с цитированием
  #3 (permalink)  
Старый 17.11.2021, 13:25
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,518

Тяжелый код сейчас можно пихать в webworker.
Вот тут недавно делал простой пример(содержимое не суть).

Либо разбивать ваши вычисления на куски, которые уже в свою очередь вызывать через Promise.then. Просто засунуть код в Promise.then никак вам не поможет, это не магия.
__________________
29375, 35

Последний раз редактировалось Aetae, 17.11.2021 в 13:30.
Ответить с цитированием
  #4 (permalink)  
Старый 17.11.2021, 16:54
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,007

Сообщение от Aetae
Либо разбивать ваши вычисления на куски, которые уже в свою очередь вызывать через Promise.then
если в Promise.then, то всё равно будет подвисать, это же очередь микротасков. Надо в setTimeout
Ответить с цитированием
  #5 (permalink)  
Старый 17.11.2021, 17:47
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,719

Или requestIdleCallback, если не думать про Safari
Ответить с цитированием
  #6 (permalink)  
Старый 18.11.2021, 01:15
Интересующийся
Отправить личное сообщение для JobLack Посмотреть профиль Найти все сообщения от JobLack
 
Регистрация: 08.06.2017
Сообщений: 24

Сообщение от ksa Посмотреть сообщение
Я такое просто "стартую" и сразу возвращаю некую "ссылку/ключ".
Потом с некой периодичностью опрашиваю сервер с этой "ссылкой/ключем" и получаю ответ типа "готово или нет" и "на каком этапе"...
Если готово - запрашиваю данные.
Если не готово - как-то отображаю "прогресс" на клиенте...
К сожалению это выполняется на клиенте. Апдейтится огромный JSON в цикле. На сервер это переносить - даже сразу не соображу, что это может затронуть.
Ответить с цитированием
  #7 (permalink)  
Старый 18.11.2021, 01:18
Интересующийся
Отправить личное сообщение для JobLack Посмотреть профиль Найти все сообщения от JobLack
 
Регистрация: 08.06.2017
Сообщений: 24

Сообщение от voraa Посмотреть сообщение
Или requestIdleCallback, если не думать про Safari
С этим никогда не работал. Спасибо. Попробую. Идеально было бы - на несколько миллисекунд останавливать цикл, чтобы сделать промежуточный рендер.
Ответить с цитированием
  #8 (permalink)  
Старый 18.11.2021, 04:07
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,518

сonst aLittle = () => new Promise(setTimeout);

for(let i = 0; i < length; i++) {
  // code
  if(i%1000 === 0) await aLittle();
}
=)
__________________
29375, 35
Ответить с цитированием
  #9 (permalink)  
Старый 18.11.2021, 08:02
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,719

Сообщение от JobLack
С этим никогда не работал. Спасибо. Попробую.
Если без всяких изысков, по простому, то как то так
// количество итераций, которое надо сделать
const N = 100500 ;
// гарантировано без тормозов можно сделать итераций
const NS = 100;  

let start = 0;

function workns () {
	const ne = Math.min(N, start+NS)
	let i;
	for (i = start; i< ne; i++) {
		/* тут делаем итерацию */
	}
	start = i;
}

function idleWork (time) {
	while (time.timeRemaining() > 0 && start < N) {
		workns()
	}
	if (start < N) requestIdleCallback(idleWork);
}

requestIdleCallback(idleWork);


Немного похоже на requestAnimationFrame, но есть возможность проверить( .timeRemaining() ) - сколько времени еще примерно есть
Ответить с цитированием
  #10 (permalink)  
Старый 18.11.2021, 08:29
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,138

Сообщение от JobLack
К сожалению это выполняется на клиенте. Апдейтится огромный JSON в цикле.
Принцип один и тот же...
Запускаешь в setTimeout()... Процесс пишет что-то о себе в "общедоступное место"...
Остается только с неким таймаутом мониторить "то место" и по готовности получить данные для использования.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Gulp4 не обновляет браузер после изменений в scss DVV Общие вопросы Javascript 0 08.12.2020 16:04
Воспроизведение звука, если браузер свернут lolka84 jQuery 3 25.09.2020 14:20
Запрос в браузер через js Enot990 Общие вопросы Javascript 2 11.12.2017 11:32
Сайт торент видео онлайн (через браузер). nemo84 Ваши сайты и скрипты 1 18.05.2013 21:07
как проверить поддеружет браузер определенное событие? GOll Элементы интерфейса 9 24.07.2008 14:40