Javascript jQuery$.post()以递归方式(循环)
我学习jQuery,但不了解这种情况: 在调试模式下运行此代码时,所有代码都能正常工作。但正常运行此代码时,calback函数不会启动。为什么? 在非调试模式下,我有->开始->结束10 浏览器:谷歌浏览器Javascript jQuery$.post()以递归方式(循环),javascript,ajax,jquery,Javascript,Ajax,Jquery,我学习jQuery,但不了解这种情况: 在调试模式下运行此代码时,所有代码都能正常工作。但正常运行此代码时,calback函数不会启动。为什么? 在非调试模式下,我有->开始->结束10 浏览器:谷歌浏览器 var nrPost = 10; $("#buttnX").click(function() { alert("Start"); GoPosts(); End(); }); function End() { alert('End ' + nrP
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;
}
};
你有一个额外的};在你的代码中。我对它做了一些改动,使用jQuery并将其放在JSFIDLE上
它应该提醒:“开始”和“结束10”,这是正确的,根据您编写代码的方式。你还期待什么吗?你有一个额外的};在你的代码中。我对它做了一些改动,使用jQuery并将其放在JSFIDLE上
它应该提醒:“开始”和“结束10”,这是正确的,根据您编写代码的方式。你还期待什么吗?我想你期待的是:
- “开始”
- “结束0”
$.post(url、数据、回调、“json”)代码>是异步的。这意味着,一旦$.post
方法返回,请求将发送到您提供的URL。但是,回调
在JQuery收到答案之前不会被调用。立即发生的是GoPosts
终止,程序继续。它返回到代码的第5行,在click处理程序的匿名函数中。此时,将调用End()
,并向“End 10”发出警报
您可能希望将调用放在回调中的结束
:
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;
}
};
我想您期望的显示是:
- “开始”
- “结束0”
这不太可能适用于您的解决方案
您的Ajax调用$.post(url、数据、回调、“json”)代码>是异步的。这意味着,一旦$.post
方法返回,请求将发送到您提供的URL。但是,回调
在JQuery收到答案之前不会被调用。立即发生的是GoPosts
终止,程序继续。它返回到代码的第5行,在click处理程序的匿名函数中。此时,将调用End()
,并向“End 10”发出警报
您可能希望将调用放在回调中的结束
:
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;
}
};
我不知道您打算如何使用递归实现,但如果仅此而已,您实际上可以这样做:
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) });
函数startOOP(nrPost){
//不需要把这个循环
$.ajaxSetup({async:false});
对于(变量i=0;i
希望有帮助 我不知道您打算如何使用递归实现,但如果仅此而已,您实际上可以这样做:
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) });
函数startOOP(nrPost){
//不需要把这个循环
$.ajaxSetup({async:false});
对于(变量i=0;i
希望有帮助 “调试模式”指的是什么?谷歌chrome有“检查元素”和“Scrips”选项卡。当我点击我的javascript代码执行时,(这个工具也有断点,我使用它一步一步结束执行代码,使用F10和F11…)。我是这个世界上的新手。我只能猜测,但你能精确地知道你期望的输出是“开始”->“结束0”吗?是的,期望“开始”->“结束0”。这段代码很好,问题是在我的URL中,当我第二次发布时,它会响应一个错误(这个错误来自服务器上的发布速度)你所指的“调试模式”是什么?谷歌浏览器有“检查元素”还有“纸条”。当我点击我的javascript代码执行时,(这个工具也有断点,我使用它一步一步结束执行代码,使用F10和F11…)。我是这个世界上的新手。我只能猜测,但你能精确地知道你期望的输出是“开始”->“结束0”吗?是的,期望“开始”->“结束0”。这段代码很好,问题是在我的URL中,当我第二次发布时,它响应了一个错误(这个错误来自服务器上的发布速度)是的,我期望回调10次,直到nrPost=0;因为一个调用GoPosts();每次当nrPost大于0时,您甚至可以通过使其成为一个函数来简化它。[@Artiom:Ok,更新它以显示它正在调用它10次。我刚刚在回调方法中添加了一个警报。注意:我使用的是jsfiddle的ajax测试url:“/echo/json/”,如果您复制了代码,则忽略它。是的,我希望回调10次,直到nrPost=0;因为调用GoPosts();每次nrPost大于0时。您甚至可以将其简化为一个函数。[@Artiom:好的,更新它以显示它正在调用它10次。我只是在回调方法中添加了一个警报。注意:我使用的是jsfiddle的ajax测试url:“/echo/json/”,如果您复制了代码,请忽略这一点。”您的ajax调用$.post(url,data,Callback,'json');是异步的。$.ajaxSetup({async:false});这是怎么做的?我只想执行GoPost(),直到nrPost更稳定。我认为async:false
只有在使用$.ajax
时才有效。我认为它不适用于$.post
“您的ajax调用$.post(url,data,Callback,'json'));是异步的。$.ajaxSetup({async:false});这是怎么回事?我只想执行GoPost(),直到nrPost更稳定。0我认为async:false
只有在使用$.ajax
时才有效。我知道