#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.
Он должен предупреждать: «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