Вопрос о setTimeout, на который мне нужно ответить - PullRequest
0 голосов
/ 18 сентября 2018

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

if (1 == 1) {
//huge chunk of code
} //end of if (1 == 1)

var theTime = 1000;
var timeout = setTimeout("location.reload(true);", theTime);
function resetTimeout() {
clearTimeout(timeout);
timeout = setTimeout("location.reload(true);", theTime);
} //end of function resetTimeout()

Моя цель - заставить первую часть кода завершить выполнение, а затем обновить страницу, как только завершится выполнение первой части кода.Есть ли способ сделать это?

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

В вашем случае страница перезагрузится через 1 секунду после вызова setTimeout.Так что это «огромный кусок кода» плюс 1 секунда.

Чтобы обновить страницу, как только закончится первая часть кода, просто позвоните location.reload без setTimeout:

if (1) {
  //huge chunk of code
}

location.reload(true);

РЕДАКТИРОВАТЬ: Этот подход не ожидает завершения асинхронного кода.Например, приведенная ниже программа прерывается перезагрузкой до всплывающего окна с предупреждением.

if (1) {
  setTimeout(() => alert('Test'), 1000);
}

location.reload(true);
0 голосов
/ 18 сентября 2018

JavaScript является однопоточным и не имеет преимущественного вытеснения, невозможно прервать работающий код. Асинхронный код, такой как тайм-ауты и обратные вызовы AJAX, не может быть запущен, пока текущий исполняемый код не вернется в основной цикл событий.

Таймер в setTimeout запускается сразу после его вызова. Но из-за однопоточного дизайна обратный вызов не может быть вызван, пока не закончится весь ваш текущий JS. Если это займет больше времени, чем таймер, обратный вызов будет отложен. Таким образом, все, что вам гарантировано, это то, что обратный вызов будет вызван, по крайней мере, за это время - он может быть длиннее, но не короче. В очереди событий могут быть и другие асинхронные обратные вызовы.

0 голосов
/ 18 сентября 2018

Если вы установите для TimeTimeout очень маленькое значение (например, 1 мс, возможно, даже ноль, но не проверили это), оно будет выполнено, как только ваш основной код будет завершен. Он не будет выполнен, пока ваш основной код не будет завершен, потому что JavaScript не является многопоточным.

...