2013-09-10 3 views
0

Недавно я обновил приложение, которое использует Dojo для отправки асинхронных запросов на мой сервер, который обслуживает эти петиции с помощью cgi.Установка таймаута при использовании Dojo

Моя проблема заключается в следующем. Так, например, переменная, которая делает запросы в

parent.sc_dojo.io.script.jsonp_sc_dojoIoScript2 

Эта новая услуга занимает слишком много времени, чтобы отправить ответ приблизительно 40 - 60 секунд, а по истечении этого времени переменная parent.sc_dojo.io.script.jsonp_sc_dojoIoScript2 появляется как НЕОПРЕДЕЛЕННЫЙ

Я провел анализ с использованием firebug, см. Следующее изображение для получения подробной информации.

Petitions to my server responded in 40 to 50 secs

Петиция к серверу следующие данные:

Connection Keep-Alive 
Content-Type text/javascript; charset=utf-8 
Date Tue, 10 Sep 2013 12:39:22 GMT 
Keep-Alive timeout=5, max=100 
Server Apache/2.2.22 (Ubuntu) 
Transfer-Encoding chunked 

Таймаут колеблется от 5 до 100, я не знаю единицы этой меры, Любые идеи?

ответ

1

О связи Keep-Alive
Когда клиентский браузер посылает «Connection: Keep-Alive» заголовок к/1.1 сервер HTTP, браузер говорит: «Эй, я хочу продолжать длинный разговор, поэтому не закрывайте соединение после первого обмена ».

Значение тайм-аута «keep-alive» находится в секундах. Значение «max» меньше единицы измерения, что соответствует максимальному количеству запросов на обслуживание для каждого соединения. Взятые вместе, они дополняют запрос клиента «эй, я хочу продолжить длинный разговор, поэтому не закрывайте соединение после первого обмена BUT , если ничего не обменивается через 5 секунд (тайм-аут) ИЛИ , если более 100 запросы идут назад и вперед (макс.), я в порядке с вами, закрывая соединение ». Сервер отвечает фактическими значениями, которые он будет обслуживать для тайм-аута и макс.

Штраф за закрытое соединение заключается в том, что необходимо открыть новый. Некоторые современные браузеры ограничивают количество одновременных открытых подключений, поэтому слишком малое значение этих значений может привести к задержке (пока ваше приложение ждет бесплатных подключений). С другой стороны, сервер не должен соглашаться с запросами таймаута и максимального значения: сервер устанавливает свои собственные пределы.

Смотрите эти статьи для деталей:

О додзе таймаута
Я не вижу свой код или додзё версию, но dojo позволяет вам установить, как долго g он будет ждать ответа через the timeout property in the XHR request. Тайм-аут по умолчанию «никогда». Код ниже.

На практике «никогда» вводит в заблуждение: в браузерах есть their own defaults для тайм-аутов keep-alive и upstream routers might have their own timeouts.

Старайтесь держать его коротким.Если ответ занимает более 15 секунд, то, возможно, потребуется, чтобы быть a different design approach to the problem: обратный Ajax, опрос, в сочетании ответа и т.д.

require(['dojo/request/xhr'], function (xhr) { 
    xhr(
    'http://www.example.com/echo', 
    { timeout:15000 /* change this, units are milliseconds */, handleAs:'json' } 
).then(function (r) { 
    console.log(r); 
    }); 
}); 

конкретной проблемы
Хорошо, наконец. Если у вас есть длинный стороне сервера бежать, вот что я хотел бы сделать:

  1. Отправить запрос от клиента к серверу, который начинает работу
  2. Сервер отвечает с уникальным URL, который может быть запрошен для статуса
  3. в Javascript, используйте setInterval() периодически проверять возвращенный URL для статуса
  4. Когда URL показывает «статус» сделано, убить setInterval и выдать окончательный вызов, чтобы получить результат
Смежные вопросы