2013-08-21 4 views
1

Я пишу очередь в JavaScript, которая будет обрабатываться несколькими «серверами» асинхронно. Я обеспокоен тем, что два сервера могут получить один и тот же элемент из очереди. Кажется, сейчас это не происходит, но я не хочу оставлять это на произвол. Насколько мне известно, JavaScript является однопоточным; позволяет ли предположить, что, хотя одновременно будет несколько запросов, JavaScript использует собственную очередь для выполнения функции?Управление очередью с несколькими асинхронными вызовами

function getJob() { 
    if(jobs.length > 0) { 
     var job = jobs.shift(); 
     $('#jobStatsQueueCount').text(jobs.length); 
     return job; 
    } else { 
     return null; 
    } 
} 

Вот полный код:

http://jsfiddle.net/L7yaB/5/

ответ

0

JavaScript является однопоточных; делает это допускает предположение о том, что даже если будет несколько запросов одновременно

«в то же время» не существует в компьютерной земли. Всегда есть порядок.

Если вы нажмете дважды, вы получите два события onclick, один за другим. Даже если ваш браузер был занят, пока вы нажимали, они все равно будут происходить один за другим, и в том же порядке вы их уволили. Это то, что вы можете предположить: События никогда не участвуют в гонке друг друга, обгоняют или чередуются.

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

+0

Правда, но как насчет этого сценария: есть одна работа; сервер 1 определяет, что есть одно задание; сервер 2 определяет, что есть одно задание, сервер 1 получает задание, а затем сервер 2, уже прошедший проверку, терпит неудачу, потому что работа ушла. – scader

+0

... или, вы говорите, что выполнение 2-го сервера сервера getJob произойдет не до завершения выполнения 1-го сервера? – scader

+0

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