Показать сообщение отдельно
  #9 (permalink)  
Старый 20.12.2017, 19:00
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,138

Сообщение от jaroslav.tavgen Посмотреть сообщение
А как сделать так, чтобы он добавлял по одной буковке за раз?
В цикле практически ни как.

JS строго однопоточен. т.е. использовать несколько потоков в одном контексте исполнения невозможно.
в JS невозможно ограничить область видимости одного потока от области видимости другого потока (глобальный объект, цепочка прототипов) доступны всем и всегда. Изменения данных в одном потоке сделают непредсказуемым результат работы в другом потоке.

самый простой способ обойти блокировку других задач (рендеринга) пока работает долгий код это разбить задачу вызовами асинхронной функции setTimeout (задача,0) т.е. запустить/продолжить задачу после того как браузер сделает все ожидающие операции.

небольшой пример
<body><script>
function repeat (fun,size){
	+function asd (){
		fun();
		if (size % 110 == 0) document.body.innerHTML += "<br>";
		if ( --size > 0) setTimeout (asd,0);
	}();
}
function idiotizm (){
	document.body.innerHTML += "a";
}
repeat (idiotizm , 6000);
</script>

Последний раз редактировалось MallSerg, 20.12.2017 в 19:05.
Ответить с цитированием