ПРИМЕЧАНИЕ. Я решил закрыть частный блог, в котором я вел технические статьи, так как у меня не так много времени, чтобы писать в нем, и он устарел. Некоторые из статей, которые я написал об этом и которые хочу сохранить, я решил разместить на Medium. Некоторые могут быть старыми…

Я много раз встречал этот вопрос в разных группах и на разных платформах. Многие из них вынуждены отложить выполнение своего кода и, естественно, обращаются к вопросу об эквиваленте метода Thread.Sleep (из wither c # или java) в Javascript.

Проблема в том, что Javascript не поддерживает потоки (пока!).

Таким образом, наиболее распространенный обходной путь - заключить выполнение кода в setTimeout. Хотя это, без сомнения, задерживает выполнение кода, это не всегда то, чего мы ожидаем. Это разбивает наш код на несколько частей, что затрудняет отладку / поддержку. Кроме того, он выполняет код, на самом деле не останавливая поток нашего приложения - мы можем захотеть остановить все (даже за счет замораживания основного потока - нашего приложения / окна), пока оно не перестанет «спать».

Поэтому я подумал, что попробую использовать другой подход, чтобы попытаться лучше имитировать поведение Thread.Sleep.

Это мое пространство имен «Thread»:

var Thread = {
	sleep: function(ms) {
		var start = Date.now();
		
		while (true) {
			var clock = (Date.now() - start);
			if (clock >= ms) break;
		}
		
	}
};

И так я это называю:

var d1 = new Date();
console.log('start ' + d1.toLocaleTimeString());
Thread.sleep(10000);
var d2 = new Date();
console.log('end ' + d2.toLocaleTimeString());

А если посмотреть в консоль, то получим следующий результат:

start 1:41:21 PM
end 1:41:31 PM

Если вы планируете использовать это, делайте это осторожно. Я сделал это как POC. Это приведет к остановке вашего приложения на указанное вами количество миллисекунд.