Я использую Google App Engine для запуска некоторых моих проектов. Из-за 30-секундного ограничения времени, которое оно накладывает на запросы, я использую курсоры и memcache для регулирования процесса извлечения данных.
Постановка задачи:
- У меня есть журнал вызовов ajax, который представляет собой список всех деталей, которые мне нужны от сервера, созданных при некотором взаимодействии с пользователем
- Каждый вызов ajax в журнале вызовов может содержать данные, которые могут привести к достижению 30-секундного ограничения. Поэтому мне нужно разбить его и вернуть по частям.
- Как только все вызовы в журнале завершены, мне нужно выполнить некоторую пользовательскую логику, основанную на возвращаемых данных.
Теперь у меня уже есть решение, которое работает следующим образом:
- Инициировать первый Ajax-вызов с некоторым случайным идентификатором
- По возвращении проверьте какой-либо параметр, чтобы определить, были ли получены все необходимые данные.
- Если нет, то снова выполнить вызов с тем же случайным идентификатором, что и на шаге 1 + сохранить все данные, которые были получены до сих пор
- Если да, удалите элемент из журнала и повторите шаги для следующего элемента
Но весь этот код в настоящее время обрабатывается в событии успеха вызова ajax. Я прочитал о jQuery Deferreds , и кажется, что это действительно хороший кандидат для исправления ужасного кода, который используется в настоящее время.
Я уже понял следующее:
- Используйте
$.when.apply(null, arrayOfDeferreds)
для создания динамического списка вызовов - читайте jQuery.when
- Теперь я могу использовать функцию deferred.done, чтобы сохранить дамп данных для каждого вызова
Проблема в том, как я могу сказать отложенному, что если запрос должен быть вызван снова, то не разрешайте запрос ajax - просто сохраните мои данные и снова выполните вызов с тем же случайным идентификатором, что и первоначальный вызов? То есть, в основном, вызывая мою функцию done несколько раз, пока все данные не будут сохранены? Если есть лучший способ сделать это, пожалуйста, предоставьте объяснение.