Запуск одного за другим в JQuery - PullRequest
0 голосов
/ 26 мая 2011

У меня есть этот фрагмент кода от того, что я разрабатываю

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
<script type="text/javascript">
    $(function(){
        $("#Submit").click(function(){
        var Count = document.frmOne.count.value
        for (i=1;i<=Count;i++)
        {
            $.ajax({
                url:"process.php",
                type:"get",
                data:$("form").serialize(),
                success:function(response){
                    var obj = jQuery.parseJSON( response );
                    var success = obj.success;
                    var actionsNumber = obj.number;
                    $("#result").html('There have been  '+actionsNumber+'  loops completed');    


                }
            })
        }
                $.ajax({
                     url:"done.php",
                     type:"get",
                      })
        })
    })
</script>

, и в основном мне нужно завершить весь цикл for, а затем запустить "done.php"Но в настоящее время кажется, что он запускает done.php после примерно 2 циклов в цикле for.

Итак, давайте посмотрим, смогу ли я объяснить это лучше.У меня весь этот js-скрипт запускается после того, как кто-то нажимает кнопку отправки.Я запустил process.php для введенного пользователем количества раз, затем я хочу, чтобы он запускал done.php после завершения цикла for.Но в настоящее время он запускает process.php около двух раз, затем done.php, а затем продолжает с process.php.

Как я могу это исправить?

Теперь я попробовал это, и оно не работает до сих пор, любая помощь, пожалуйста

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
<script type="text/javascript">
    $(function(){
        $("#Submit").click(function(){
        var Count = document.frmOne.count.value
        var b = 0
        for (i=1;i<=Count;i++)
        {
            $.ajax({
                url:"process.php",
                type:"get",
                data:$("form").serialize(),
                success:function(response){
                    var obj = jQuery.parseJSON( response );
                    var success = obj.success;
                    var actionsNumber = obj.number;
                    $("#result").html('There have been  '+actionsNumber+'  loops completed');   
                    b++;


                }

            })
    if(Count == b)
            {
                $.ajax({
                    url:"done.php",
                    type:"get",

                      })
                      var b = 0
            }
        }



        })
    })
</script>

Ответы [ 3 ]

1 голос
/ 26 мая 2011

Краткий ответ - вам нужно установить опцию async: false в запросах ajax внутри вашего цикла for.

Более длинный ответ - Ваша функция успеха, которая выводит количество циклов, выполняется только тогда, когда запросы делают этообратно к вам, не , когда они отправлены.Ваш цикл фактически завершается до того, как запрос на done.php отправлен, но вы не можете контролировать порядок возврата ваших запросов. Вы можете убедиться в этом, переместив эту строку:
$("#result").html('There have been '+actionsNumber+' loops completed');
вправо дозапрос ajax в цикле.

0 голосов
/ 26 мая 2011

В вашем обратном обратном вызове ajax-запроса добавьте логику, чтобы проверить, является ли это последним обратным вызовом ajax-запроса, если да. Позвоните на done.php вызов.

for(var i;i<=Count;i++)    
    $.ajax({
    ...
    ,success:function(data){
       if(Count == i)
       {
          $.ajax({
          ..
          url:"done.php",
          ..
          });
       }

    },
    ..
    });
}
0 голосов
/ 26 мая 2011

Сохраните еще один счетчик, увеличьте его в обратном вызове первого вызова ajax (внутри цикла).Затем вызовите второй вызов ajax для done.php, только когда этот счетчик достигнет Count.

$. Ajax является асинхронным, и поэтому в вашем коде он не будет ждать завершения всех вызовов внутри цикла, прежде чем перейтивызов done.php.Вот как работает AJAX.

...