Google App Engine + JQuery AJAX отложенным + курсоры - PullRequest
0 голосов
/ 30 января 2012

Я использую Google App Engine для запуска некоторых моих проектов. Из-за 30-секундного ограничения времени, которое оно накладывает на запросы, я использую курсоры и memcache для регулирования процесса извлечения данных.

Постановка задачи:

  1. У меня есть журнал вызовов ajax, который представляет собой список всех деталей, которые мне нужны от сервера, созданных при некотором взаимодействии с пользователем
  2. Каждый вызов ajax в журнале вызовов может содержать данные, которые могут привести к достижению 30-секундного ограничения. Поэтому мне нужно разбить его и вернуть по частям.
  3. Как только все вызовы в журнале завершены, мне нужно выполнить некоторую пользовательскую логику, основанную на возвращаемых данных.

Теперь у меня уже есть решение, которое работает следующим образом:

  1. Инициировать первый Ajax-вызов с некоторым случайным идентификатором
  2. По возвращении проверьте какой-либо параметр, чтобы определить, были ли получены все необходимые данные.
  3. Если нет, то снова выполнить вызов с тем же случайным идентификатором, что и на шаге 1 + сохранить все данные, которые были получены до сих пор
  4. Если да, удалите элемент из журнала и повторите шаги для следующего элемента

Но весь этот код в настоящее время обрабатывается в событии успеха вызова ajax. Я прочитал о jQuery Deferreds , и кажется, что это действительно хороший кандидат для исправления ужасного кода, который используется в настоящее время.

Я уже понял следующее:

  1. Используйте $.when.apply(null, arrayOfDeferreds) для создания динамического списка вызовов - читайте jQuery.when
  2. Теперь я могу использовать функцию deferred.done, чтобы сохранить дамп данных для каждого вызова
    Проблема в том, как я могу сказать отложенному, что если запрос должен быть вызван снова, то не разрешайте запрос ajax - просто сохраните мои данные и снова выполните вызов с тем же случайным идентификатором, что и первоначальный вызов? То есть, в основном, вызывая мою функцию done несколько раз, пока все данные не будут сохранены? Если есть лучший способ сделать это, пожалуйста, предоставьте объяснение.

1 Ответ

2 голосов
/ 30 января 2012

Вы можете использовать рекурсивную трубу следующим образом:

function myFetch( id ) {
    return $.ajax({
        url: serviceURL,
        data: {
            id: id,
            someOthers: data
        }
    }).pipe(function( data ) {
        saveData( data );
        if ( !isOK( data ) ) {
            return myFetch( id );
        }
    });
}

Запрос ajax определяется только один раз, и вы условно перевыпускаете его в обработчике канала.

...