2013-03-08 3 views
1

Я повторяю ряд дат с помощью кода ниже. каждый раз я делаю запрос ajax и возвращаю xml-данные, которые затем вызывают функцию, чтобы отображать серию divs в строке на моей странице. Проблема в том, что мой цикл завершен до первого вызова ajax. Как я могу удерживать цикл for до тех пор, пока мой запрос и функция ajax не будут завершены? Любая помощь очень ценится! , спасибоfor loop .. wait for AJAX request

 // Start of the loop for the date range selected  

     for(loopTime = startTime; loopTime <= endTime; loopTime += 86400000) { 

     // Produce the day from the date 
       loopDate=new Date(loopTime) 
       day = loopDate.getDate() ;   if (day < 10) { day = "0" + day } ; 
       mon = loopDate.getMonth()+1 ; if (mon < 10) { mon = "0" + mon } ; 
       year = loopDate.getFullYear()  
       epDate = year + "-" + mon + "-" + day 

     // Run the XML Query ONCE ONLY 
       $.ajax({ 
        type: "POST", 
        url: "php_assoc/jobs_today.php", 
        data: { OnThisDate : epDate }, 
        dataType: "xml", 
        success:returnedXMLdata    
        }); 

     }// for loop date 




     function returnedXMLdata(data) { 
      script .... 
+0

Аналого в AJAX расшифровывается asynchonous, то есть вызов выполняется и отключается самостоятельно и отвечает в части «обратного вызова» кода («успех»). Будьте ясны, что вам нужно здесь. –

+1

Какая конкретная проблема возникает? Перегрузка сервера, потому что все звонки AJAX происходят сразу? – Alnitak

+0

Обратный вызов создает строку divs, начинающуюся с даты (epDate). Проблемы состоят в том, что я получаю строку после строки той же даты, которая является последней датой в моем цикле for /. То, что я хочу достичь, аналогично к календарю со списком дат – Mick

ответ

5

Ваша проблема, по-видимому, не о том, что цикл заканчивается рано (это на самом деле хорошая вещь), но все запросы AJAX уволят почти сразу.

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

var loopTime = startTime; 
(function iterate() { 
    $.ajax(...).always(function() { 
     loopTime += 86400 * 1000; 
     if (loopTime <= endTime) { 
      iterate(); 
     } 
    }); 
})(); 
3

Внутри запроса ajax добавьте свойство async и установите для него значение false.

async: false, 
+3

В то время как это устранит проблему, это очень *, *** очень плохой практикой использовать синхронные запросы AJAX; ваш браузер будет заблокирован и непригодным для использования в течение * всех * ваших запросов AJAX. – Matt

+0

@Matt +1, никогда, никогда, никогда не делайте _synchronous_ AJAX звонки. Это такая плохая идея, что они собираются удалить ее в будущей версии jQuery – Alnitak

+1

Это плохая рекомендация. sync ajax вызывает блокировку браузера. Это никогда не лучший пользовательский опыт, чем правильный асинхронный дизайн. – jfriend00