2014-12-08 4 views
0

Я потратил немало времени, пытаясь понять это с помощью различных итераций кода, но не повезло. Исходя из php-фона, я новичок в javascript.Последовательные запросы ajax с jquery

предположим массив из трех исправлений: patch1, patch2, patch3. Что я пытаюсь достичь:

  1. Ajax вызов к тому же PHP скрипт для каждого патча, , но каждый вызов должен быть сделан только после того, как предыдущий вызов завершен
  2. После всего 3 завершается вызов ajax для отдельного сценария php.

Пункт 2 работает нормально, точка 1 не так.

Ниже мой код: myAjaxInitialData func (и базовый скрипт php) вызывается одновременно для всех 3 патчей, а не ждет завершения каждого из них. MyAjaxGetSRCount, правильно, не называется unitl, все патчи завершены.

<body onload="initialData(0)"> 

<script> 
function initialData(i) { 

    var patches = [<?php echo $jsPatchArray ?>]; 
    var x = patches.length - 1; 

    var divId = "#initialData-patch-" +i; 
    var script = "ajax_initial_data.php"; 
    var dataVar = "patch"; 
    var data = patches[i]; 

    if (i != x) { 
     i++; 
     $.when(myAjaxInitialData(divId,script,dataVar,data)).then(initialData(i)); 
    } else { 
     $.when(myAjaxInitialData(divId,script,dataVar,data)).then(myAjaxGetSRCount); 
    } 
} 


function myAjaxInitialData(divId,script,dataVar,data) { 

    return $.ajax({ 
     type: "GET", 
     url: script, 
     data: {patch:data}, 
     success: function(response) {  
      $(divId).html(response); 
     } 
    }); 
} 

function myAjaxGetSRCount() { 

    document.getElementById('srCount').innerHTML="Retrieving SR Counts.."; 

    $.ajax({ 
     type: "GET", 
     url: "ajax_sr_count.php", 
     success: function(response) { 
      $("#srCount").html(response); 
     } 
    }); 
} 
</script> 

ответ

1

Ваша проблема, кажется, здесь:

$.when(myAjaxInitialData(divId,script,dataVar,data)).then(initialData(i)); 

then принимает функцию обратного вызова, то есть функции. initialData(i) ничего не возвращает, поэтому вы передаете undefined в эту функцию. Если вы хотите позвонить initialData после этого запроса ajax, вам необходимо обернуть его в функцию без параметра.

$.when(myAjaxInitialData(divId,script,dataVar,data)).then(function() { initialData(i); }); 

Вы также должны быть хорошо осведомлены о том, что значение i будет значение во время обратного вызова. При закрытии переменных итератора вы должны зафиксировать ожидаемое значение перед созданием обратного вызова. То есть

if (i != x) { 
    i++; 
    var j = i; 
    $.when(myAjaxInitialData(divId,script,dataVar,data)).then(function() { initialData(j); }); 
} 
+0

Спасибо Тим - обработал удовольствие - не может претендовать на понимание функции() {initialData (j); } 'vs plan old' initialData (j) ', но это, без сомнения, из-за статуса js noobie - еще раз повторит поиск. –

+0

@DaveF Последний выполняет 'initialData' с' j' в качестве параметра; первая создает функцию, которая делает то же самое. Он работает, потому что вы не хотите немедленно запускать 'initialData'; вы хотите сказать что-то еще, чтобы выполнить его, когда это будет сделано. –

Смежные вопросы