Не осталось двух копий переменной. Javascript в веб-браузерах - однопоточный (если вы не используете новый материал для веб-рабочих ). Таким образом, анонимная функция никогда не может работать, потому что Wait
связывает интерпретатор.
Вы не можете использовать функции занятости в браузерном Javascript; больше ничего не случится (и это плохая идея в большинстве других сред, даже там, где это возможно). Вы должны использовать обратные вызовы вместо этого. Вот минималистская переделка этого:
var interval_id;
var countdowntimer = 0;
function Wait(wait_interval, callback) {
countdowntimer = wait_interval;
interval_id = setInterval(function() {
if (--countdowntimer <=0) {
clearInterval(interval_id);
interval_id = 0;
callback();
}
}, 1000);
}
// Wait a bit: 5 secs
Wait(5, function() {
alert("Done waiting");
});
// Any code here happens immediately, it doesn't wait for the callback
Редактировать Ответ на ваше сообщение:
Но в какой момент обработки этого единственного потока происходит так называемый асинхронный вызов с использованием setInterval? Это только между вызовами функций? Конечно, нет, как насчет функций, выполнение которых занимает много времени?
В значительной степени, да & mdash; и поэтому важно, чтобы функции не были долговременными. (Технически это даже не между вызовами функций, в том случае, если у вас есть функция, которая вызывает три другие функции, интерпретатор не может делать что-либо еще, пока эта (внешняя) функция работает.) Интерпретатор по существу поддерживает очередь функций, в которых он нуждается выполнить. Он начинается с выполнения любого глобального кода (скорее как большой вызов функции). Затем, когда что-то происходит (события пользовательского ввода, достигается время для вызова обратного вызова, запланированного с помощью setTimeout
и т. Д.), Интерпретатор помещает вызовы, необходимые для выполнения, в очередь. Он всегда обрабатывает вызов в начале очереди, и поэтому все может сложиться (например, ваши setInterval
вызовы, хотя setInterval
- это bit special & mdash; он не будет ставить в очередь последующий обратный вызов если предыдущий все еще находится в очереди, ожидая обработки). Поэтому подумайте о том, когда ваш код получает контроль и когда он освобождает контроль (например, путем возврата). Переводчик может только делать другие вещи после того, как вы отпустите контроль и перед тем, как он вернет его вам снова. И опять же, в некоторых браузерах (например, IE) этот же поток также используется для рисования пользовательского интерфейса и т. Д., Поэтому вставки DOM (например) не будут отображаться, пока вы не вернете элемент управления обратно в браузер, чтобы он мог получить на том, чтобы делать свою живопись.
Когда Javascript используется в веб-браузерах, вам действительно необходим подход, основанный на событиях, для разработки и кодирования ваших решений. Классический пример - запросить информацию у пользователя. В мире, не связанном с событиями, вы можете сделать это:
// Non-functional non-event-driven pseudo-example
askTheQuestion();
answer = readTheAnswer(); // Script pauses here
doSomethingWithAnswer(answer); // This doesn't happen until we have an answer
doSomethingElse();
Это не работает в мире событий. Вместо этого вы делаете это:
askTheQuestion();
setCallbackForQuestionAnsweredEvent(doSomethingWithAnswer);
// If we had code here, it would happen *immediately*,
// it wouldn't wait for the answer
Так, например, askTheQuestion
может перекрывать элемент div на странице с полями, запрашивающими у пользователя различные фрагменты информации, с кнопкой «ОК», по которой они могут щелкнуть, когда все будет готово. setCallbackForQuestionAnswered
действительно будет перехватывать событие click
на кнопке «ОК». doSomethingWithAnswer
будет собирать информацию из полей, удалять или скрывать div и что-то делать с информацией.