2011-02-01 3 views
10

Скажите, что у меня есть следующий код:Javascript порядок выполнения с SetTimeout()

function testA { 
    setTimeout('testB()', 1000); 
    doLong(); 
} 

function testB { 
    doSomething(); 
} 

function doLong() { 
    //takes a few seconds to do something 
} 

я выполнить testA(). Я прочитал, что Javascript является однопоточным. Что произойдет после 1000 миллисекунд, когда достигнут тайм-аут для testB()?

Некоторые возможности я могу думать:

  • testB() находится в очереди, чтобы выполнить после doLong() и все остальное, что называется закончили.
  • doLong() немедленно прекращается и начинается testB().
  • doLong() предоставляется некоторое время для выполнения перед остановкой (автоматически или после запроса пользователя) и запускается testB().
  • doLong() приостановлено, testB() запущено. После окончания testB(), doLong() возобновляется.

Каков правильный ответ? Это зависит от реализации или от части стандарта? *

This question похоже, но не то же самое, насколько я могу судить.

Любые ссылки, которые можно рекомендовать для лучшего понимания. Выполнение Javascript оценили бы.

Спасибо!

* Да, я знаю, что не все браузеры следовать стандартам :(

ответ

10

Первый из ваших догадок является правильным: testB() is queued up to execute after doLong() and anything else it called have finished.

Если это занимает более одной секунды для testA закончить, testB просто придется подождать.

Кроме того, вы должны написать setTimeout(testB, 1000), а не setTimeout('testB()', 1000). Отправка строки в SetTimeout это, как с помощью eval, generally considered evil и сделает вас враги;)

+0

Я пришел к выводу, что 'setTimeout (function() {testB(); }, 1000), 'лучший способ, были ли я введены в заблуждение? –

+2

@ Shadow Wizard: Да, в значительной степени введен в заблуждение. Насколько я знаю, нет никакой разницы между вашим путем и моим (за исключением того, что моя короче, конечно: D). Чтобы проиллюстрировать, представьте, если бы мы вытащили ваше выражение в переменную: 'var f = function() {testB(); }; setTimeout (f, 1000); '. Все тот же смысл, но теперь вы можете видеть избыточность. – Jakob

+1

Спасибо, как за ответ, так и за совет о передаче функции setTimeout вместо String. Похоже, что учебники, которые я читал, немного сомнительны;) –

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