Javascript jQuery$.post()以递归方式(循环)

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

我学习jQuery,但不了解这种情况:

在调试模式下运行此代码时,所有代码都能正常工作。但正常运行此代码时,calback函数不会启动。为什么? 在非调试模式下,我有->开始->结束10

浏览器:谷歌浏览器

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”
这不太可能适用于您的解决方案

您的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;
    }
};

我想您期望的显示是:

  • “开始”
  • “结束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
时才有效。我知道