Здравствуйте, sergey123_1, Вы писали:
_>Столкнулся с необходимостью делать несколько XHR с одной страницы одновременно. Дело в том, что каждый ответ приходит через 3-10 секунд(но не потому что сервер плохой, а потому что server-side скрипты ходят на оборудование, которое медленно выдаёт результат).
Сделайте так, чтобы server-side скрипт запускал отдельный поток на обработку задачи и сразу возвращал управление браузеру. Когда задача завершится, сохраните её статус, например в базу. После того, как все задания были запущены на сервере, клиент должен начать периодически опрашивать сервер о статусе задач.
Столкнулся с необходимостью делать несколько XHR с одной страницы одновременно. Дело в том, что каждый ответ приходит через 3-10 секунд(но не потому что сервер плохой, а потому что server-side скрипты ходят на оборудование, которое медленно выдаёт результат).
Итак, проблема состоит в том, что в пределах одного браузера(или вкладки браузера) нельзя создать несколько http-сессий к одному домену, поэтому XHR-запросы встают в очередь и как следствие, выполняются последоватьно. Эту проблему частично удалось решить тем, что создал несколько субдоменов вида ajax0.site.com, ajax1.site.com и т.д., в основную страницу вставляю несколько iframe-ов и запускаю XHR-запросы из iframe-ов (если делать без iframe-ов, а сразу обращать к ajax*.site.com, то в поле status вместо 200 появляется 0, хотя сам http-запрос делается). Однако теперь возникла проблема, что js-код в iframe-ах не может обратиться к объекту parent (по соображениям безопасности(firefox в консоле ошибок пишет Permission denied)) и не может записать результат выполнения запроса в соответсвующие элементы основной страницы. Была идея, вставлять iframe-ы прямо в таблицы, но такой вариант плох тем, что данные, которые вернулись в xhr-запросе, вообще говоря, нужно раскидывать по разным частям основной страницы.
Поэтому хочу спросить, если у кого-нибудь идеи, каким образом можно выполнять несколько XHR-запросов к одному серверу одновременно?
Здравствуйте, Lloyd, Вы писали:
L>Сделайте так, чтобы server-side скрипт запускал отдельный поток на обработку задачи и сразу возвращал управление браузеру. Когда задача завершится, сохраните её статус, например в базу. После того, как все задания были запущены на сервере, клиент должен начать периодически опрашивать сервер о статусе задач.
Спасибо. Если ничего более простого не найдётся, то так и придётся делать. У Вас случайно нет заготовки функции sleep для js?(или всё равно придётся извращаться с setTimeout и рекурсией?(как здесь))
В этом решении ещё нужно запускать дополнительный job в БД, который будет чистить статусы по таймауту(если оператор закрыл окно браузера), а чем больше костылей я сделаю, тем сложнее будет потом разбираться в проблемах, а тратить время на траблшутинг "веб-сервера" нет никакого желания(есть дела поинтереснее).
Здравствуйте, sergey123_1, Вы писали:
L>>Сделайте так, чтобы server-side скрипт запускал отдельный поток на обработку задачи и сразу возвращал управление браузеру. Когда задача завершится, сохраните её статус, например в базу. После того, как все задания были запущены на сервере, клиент должен начать периодически опрашивать сервер о статусе задач.
_>Спасибо. Если ничего более простого не найдётся, то так и придётся делать. У Вас случайно нет заготовки функции sleep для js?(или всё равно придётся извращаться с setTimeout и рекурсией?(как здесь))
Не совсем понимаю, какое это имеет отношение к первому вопросу.
_>В этом решении ещё нужно запускать дополнительный job в БД, который будет чистить статусы по таймауту(если оператор закрыл окно браузера), а чем больше костылей я сделаю, тем сложнее будет потом разбираться в проблемах, а тратить время на траблшутинг "веб-сервера" нет никакого желания(есть дела поинтереснее).
Погуглите еще по слову Comet, может под вашу платформу будет что стоящее.
Здравствуйте, Lloyd, Вы писали:
_>>Спасибо. Если ничего более простого не найдётся, то так и придётся делать. У Вас случайно нет заготовки функции sleep для js?(или всё равно придётся извращаться с setTimeout и рекурсией?(как здесь))
L>Не совсем понимаю, какое это имеет отношение к первому вопросу.
Чтобы периодически опрашивать сервер о статусе задач, нужно сколько-то ждать между опросами, например 1 секунду, функции sleep в чистом виде в js нет, поэтому и решил спросить, может быть у Вас есть такая заготовка.
Здравствуйте, sergey123_1, Вы писали:
_>Чтобы периодически опрашивать сервер о статусе задач, нужно сколько-то ждать между опросами, например 1 секунду, функции sleep в чистом виде в js нет, поэтому и решил спросить, может быть у Вас есть такая заготовка.
А что браузер будет делать при исполнении этого sleep? Уходить в ступор?
В обработчике таймера ("onTick()") просто вызывается setTimeout("onTick()", interval) и все...
Здравствуйте, sergey123_1, Вы писали:
L>>Не совсем понимаю, какое это имеет отношение к первому вопросу.
_>Чтобы периодически опрашивать сервер о статусе задач, нужно сколько-то ждать между опросами, например 1 секунду, функции sleep в чистом виде в js нет,
Ее и не может быть. Иначе получил бы подвисший UI, т.к. js выполняется в одном потоке.
_>поэтому и решил спросить, может быть у Вас есть такая заготовка.