jQuery $ .post () рекурсивным способом (цикл) - PullRequest
0 голосов
/ 13 апреля 2011

Я изучаю jQuery и не понимаю эту ситуацию:

При запуске этого кода в режиме отладки все работает хорошо.Но при нормальном выполнении этого кода функция обратного вызова не запускается. Почему?В не отладочном режиме у меня -> «Пуск» -> «Конец 10»

Браузер: Google Chrome.

var nrPost = 10;

$("#buttnX").click(function() {
    alert("Start");     
    GoPosts();
    End();
}); 

function End() {
    alert('End ' + nrPost);
};

function GoPosts() {
    $.ajaxSetup({async:false});
    var url = "http://......";
    var data = { ... };
    $.post(url, data, Callback, 'json');
};

function Callback(response) {   
    if (response.error) {
        return;
    }

    nrPost--;

    if (nrPost > 0) [
        GoPosts();
    } else {
        return;
    }
};

Ответы [ 3 ]

3 голосов
/ 13 апреля 2011

у вас был дополнительный}; в вашем коде. Я немного изменил его, чтобы использовать jQuery, и поместил его в jsfiddle.

http://jsfiddle.net/rH8RV/19/

Должно появиться предупреждение: «Начало», а затем «Конец 10», это правильно в зависимости от того, как вы написали свой код. Вы ожидали чего-то еще?

1 голос
/ 13 апреля 2011

Я не знаю, что вы планируете делать с рекурсивной реализацией, но если это все, вы могли бы сделать это:

function startLoop(nrPost) {

    // No need to put this in a loop
    $.ajaxSetup({ async: false });

    for (var i = 0; i < nrPost; i++) {
        alert('Start ' + i);

        var url = 'http://......';
        var data = {};

        $.post(url, data, function (response) {
            if (response.error)
                return;

            alert('End ' + i);
        }, 'json');
    }
}

$('#buttnX').click(function () { startLoop(10) });

Надеюсь, это поможет!

0 голосов
/ 13 апреля 2011

Я предполагаю, что вы ожидаете, что на дисплее будет:

  • «Начало»
  • «Конец 0»

Это вряд ли будет работать сваше решение.

Ваш Ajax-вызов $.post(url, data, Callback, 'json'); является асинхронным.Это означает, что после возврата метода $.post запрос отправляется на указанный вами URL-адрес.Однако Callback не вызывается до тех пор, пока JQuery не получит ответы.Сразу же происходит, что GoPosts завершается и программа продолжается.Он возвращается к строке 5 вашего кода внутри анонимной функции в вашем обработчике кликов.В этот момент вызывается End() и выдается предупреждение «Конец 10».

Возможно, вы вместо этого хотите поставить End в Callback:

function Callback(response)
{   
    if (response.error) 
    {
        return;
    }

    nrPost--;

    if(nrPost>0)
        GoPosts();
    else
    {
        End(); // You only want to end once you have made you nrPost calls to GoPost
        return;
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...