jQuery $.post() рекурсивным способом (цикл)

#javascript #ajax #jquery

#javascript #ajax #jquery

Вопрос:

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

При запуске этого кода в режиме отладки все работает хорошо. Но при обычном выполнении этого кода функция обратного вызова не запускается. Почему? В режиме без отладки у меня есть -> «Start» -> «End 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;
    }
};
  

Комментарии:

1. Что вы имеете в виду под «режимом отладки»?

2. В Google Chrome есть «Проверить элемент» и есть вкладка «Сценарии». и когда я нажимаю выполнить мой код javascript (у этого инструмента также есть точки останова, и я использую его, завершая выполнение кода шаг за шагом с помощью F10 и F11 … ). Я новичок в этом мире.

3. Я могу только догадываться, но не могли бы вы уточнить, является ли ожидаемый результат «Start» -> «End 0»?

4. Да, ожидайте «Start» -> «End 0».

5. Этот код ну, проблема в моем URL, когда я делаю вторую публикацию, он выдает ошибку (эта ошибка возникла из-за скорости публикации на сервере)

Ответ №1:

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

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

Он должен предупреждать: «Start», а затем «End 10», это правильно, исходя из того, как вы писали свой код. Вы ожидали чего-то другого?

Комментарии:

1. Да, я ожидаю обратного вызова 10 раз, пока nrPost = 0; потому что вызов GoPosts(); каждый раз, когда nrPost больше 0.

2. Вы даже можете немного упростить это, сделав это одной функцией. [ jsfiddle.net/Jaybles/rH8RV/8 /]

3. @Artiom: Хорошо, обновил его, чтобы показать вам, что он вызывает его 10 раз. Я только что добавил оповещение в метод обратного вызова. Примечание: я использую URL для тестирования ajax от jsfiddle: ‘/echo/json/’, игнорируйте это, если вы копируете код. jsfiddle.net/rH8RV/19

Ответ №2:

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

 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) });
  

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

Комментарии:

1. Спасибо, но нужен рекурсивный; потому что мой рекурсивный цикл зависит от ответа обратного вызова.

2. Ну, это так же иерархично, как и ваш пример, но вы знаете свой код лучше всех 🙂

Ответ №3:

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

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

Вряд ли это сработает с вашим решением.

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

Вероятно, вместо этого вы захотите поместить свой вызов в End in 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;
    }
};
  

Комментарии:

1. «Ваш вызов Ajax $.post(URL, данные, обратный вызов, ‘json’); является асинхронным». $.ajaxSetup({async:false}); и что это значит?

2. Я хочу выполнять GoPost() только до тех пор, пока значение nrPost не превысит 0

3. Я думаю, что это async: false работает, только если вы используете $.ajax . Я не думаю, что это работает с $.post