2013-11-07 3 views
0

Я знаком с этим поведением, но не имею слова, чтобы описать (и, следовательно, Google) его.Что такое связанная с таймаутом функция javascript?

setTimeout(function() { alert("timeout!"); }, 1000); 
veryLongProcess(); // lasts longer than 1000 milliseconds 

Я считаю, что результатом этого является то, что вы получите ваше предупреждение после того, как долго процесс будет завершен, то есть больше, чем на 1 секунду после того, как код был выполнен. Я предполагаю, что это как тайм-ауты, отправляющие функции в какой-то отдельный «поток» или «стек» или «цикл», который может запускаться только после завершения текущего, , даже если, что текущий занимает больше времени, чем было определено для таймаута.

Есть ли название для этого? Как я могу узнать больше о том, как это работает?

+2

Я считаю, что слово, которое вы ищете, является «задержкой». – ejc

+1

Одиночная резьба? http://ejohn.org/blog/how-javascript-timers-work/ – j08691

+0

_'Я представляю это как функции отправки тайм-аутов в отдельный «поток» или «стек» или «цикл», который может запускаться только после текущего закончен, даже если этот ток занимает больше времени, чем таймаут был изначально указан для .'_ - Это правильно как приблизительное или нетехническое описание того, что происходит. JavaScript является однопоточным (если вы игнорируете веб-работников), поэтому 'setTimeout' ставит очередь на функцию, которая запускается позже в том же потоке, а затем, если какой-либо другой JS работает в этой точке, время ожидания задерживается. – nnnnnn

ответ

2

Я считаю, что вы можете искать термин «синхронное» программирование.

Поскольку JavaScript однопоточный, ваш veryLongProcess() фактически вызовет предупреждение после 1000 мс из-за чего-то, называемого , блокирующего.

Учтите, что блокирование JavaScript может значительно снизить качество работы пользователя, например заблокировать браузер или вызвать диалог «kill script», нарушающий функциональность вашего процесса.

0

То, что вы ищете, называется «функциями обратного вызова». Вы можете передавать функции как переменные другим функциям, а затем выполнять их, когда захотите. Я написал быстрый пример того, как он работает ниже (непроверенный).

function longProcess(callback){ 
    //a bunch of code execution goes here 
    var testNumber = 5; 

    //This portion of code happens after all desired code is run 
    if (callback != undefined){ //Check to see if a variable 'callback' was passed... we're assuming it's a function 
     callback(testNumber); //Execute the callback, passing it a value 
    } 
} 

function testCallback(number){ 
    alert("Number: " + number); //Alert box will popup with "Number: 5" 
} 

longProcess(testCallback);  //Call your long process, passing another function as a variable 
+0

OP не спрашивает о обратных вызовах. Вопрос в том, что заставляет таймаут задерживаться. – nnnnnn

+0

Я неправильно понял акцент вопроса, однако обратные вызовы по-прежнему актуальны. Функция setTimeout передается функцией обратного вызова, которая выполняется через 1 секунду. Для меня это звучит так, как OP спрашивает об асинхронном выполнении, наиболее распространенным из них в javascript является AJAX, который является асинхронным и очень сильно использует функции обратного вызова. – ejc

Смежные вопросы