Есть ли в Javascript приоритетность сообщений? - PullRequest
0 голосов
/ 22 декабря 2011

Когда я делаю какой-то асинхронный вызов в javascript, я помещаю функцию обратного вызова в какую-то очередь, верно?

Могу ли я контролировать положение в очереди, где функция помещается каким-либо образом?Явно или по какому-то приоритету?

ОБНОВЛЕНИЕ 1

Мой вопрос касается не только AJAX.Есть несколько мест, где асинхронные вызовы используются в JS (я могу ошибаться):

  1. обработчики событий
  2. вызовы XMLHttpRequest
  3. setTimeout () / setInterval ()

Согласно ответам, я считаю, что общий ответ - НЕТ, т.е. очередь сообщений недоступна из javascript.

Ответы [ 2 ]

3 голосов
/ 22 декабря 2011

Нет. Браузер не поддерживает фактическую очередь асинхронных запросов. Не все браузеры обязательно обрабатывают его одинаково, но концептуально браузер просто приостанавливает поток, который обрабатывает запрос, до тех пор, пока ответ на этот запрос не вернется или не истечет таймер. В этот момент он возобновляет выполнение потока в обратном вызове с данными, предоставленными ответом. Я уверен, что я упростил это, но с более подробной информацией ответ, вероятно, будет отличаться в зависимости от того, о каком браузере мы говорим.

Если вы хотите упорядочить запросы AJAX, вам нужно создать механизм или найти существующий плагин / библиотеку JavaScript для этого. Самый простой способ, вероятно, состоит в том, чтобы просто делать последующие запросы в обратных вызовах запросов, которые должны иметь приоритет. Таким образом, вы знаете, что они произойдут позже, чем те, которые должны идти до них. Таймеры, конечно, вызывают свои обратные вызовы, когда они истекают. При желании вы можете заказать их, следя за временем истечения срока действия.

1 голос
/ 22 декабря 2011

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

т.е. что-то вроде:

каждый запрос AJAX будет выглядеть как /getUsers?seq=1&..., /getProps?seq=2&... и т. Д.

каждый ответ AJAX (при условии, что здесь JSON) будет возвращать полученный результат с запросом, т.е.

result {
  seq: 2,
  data: ...
}

тогда ваш обработчик обратного вызова будет выглядеть примерно так:

var responseQ = [];
function handler(response) {
  // .. code to push the response into the responseQ in increasing order of seq num ..
}

и вы можете запускать обработчик очереди каждые N секунд, который проверяет наличие ожидающих ответов в Q и обрабатывает их соответствующим образом.

т.е. что-то вроде:

setInterval(function() {

  // get last item from responseQ
  // check its seq num  
  // execute if appropriate

}, 10000);
...