递归AJAX帖子,导致计算机运行缓慢

时间:2010-07-15 06:22:24

标签: javascript jquery ajax recursion

我有这个递归循环,其中函数内部至少有2个ajax get / post,并且递归发生在第一个ajax get之后。我的功能结构是这样的,

function Loop() {
    $.get(url, data, function(result) {
        for loop to render the result {
            // render the result here
        }
        for loop to get another data using the result {
            $.post(url, result.data, function(postResult) {
                // I don't know what it did here since 
                // I don't have an access to this post
            });
            // is there a way here that i will not proceed if the post is not done yet?
        }
        setTimeout("", 1000); // I wait for 1 second for the post to finish
        Loop(); // call the recursion
    }, "json");
}

谁能告诉我这段代码有什么问题?为什么我从计算机上得到一个警告,我的脚本导致计算机运行缓慢。我知道这个代码是导致它的代码,但我不知道这个工作。

我知道在get内部的第二个循环内部会导致大量内存。有没有办法,如果ajax帖子没有完成,它将不会循环回来?

3 个答案:

答案 0 :(得分:2)

首先这一行:

   setTimeout("", 1000); // I wait for 1 second for the post to finish

不会让您的脚本等待,因为setTimeout函数使用不当。我认为您应该考虑使用setInterval来代替它:

function Loop() {
    $.get(url, data, function(result) {
        for loop to render the result {
            // render the result here
        }
        for loop to get another data using the result {
            $.post(url, result.data, function(postResult) {
                // I don't know what it did here since 
                // I don't have an access to this post
            });
            // is there a way here that i will not proceed if the post is not done yet?
        }
    }, "json");
}

setInterval( Loop, 1000);

这将使你的功能每1秒执行一次。我想这正是你想要获得的。这里没有理由进行递归调用。

答案 1 :(得分:2)

你的setTimeout不会整齐地暂停代码一秒钟:它会为一个(空的,在你的情况下)事件设置一个计时器,在一段时间后关闭。脚本的其余部分将继续与该脚本并行执行。

所以你现在比你想象的更频繁地调用你的递归函数。那是你的第一个问题。

然而,你最大的问题是无论你在帖子的结果中做什么,这完全在另一个范围内,你不能从那里打破Loop功能。你的代码中没有任何东西可以打破递归,所以它是无限的,而且非常快,并且它会发送Ajax请求。

您需要更详细地描述您想要实现的目标,也许有人可以告诉您应该如何做。唯一可以确定的是你需要使用回调。我写了一个例子,但它做了很多假设。这是我想要实现的想法的很多近似值,但毫无疑问,您需要稍微调整一下以满足您的需求。希望它能让您了解需要使用的工作流程:

function Loop() {
    $.get(url, data, function(result) {
        for loop to render the result {
            // render the result here
        }

        // this is what you're looping over in your second loop
        var postQueue = result.someArray;

        renderChildData(postQueue, 0);
    }, "json");
}

function renderChildData(array, index) {

   // this is just one item in the loop
   var currentItem = array[index];

   $.post(url, currentItem, function(postResult) {

       // we have received the result for one item
       // render it, and proceed to fetch the next item in the list

       index++;
       if(index < array.length) {
          renderChildData(array, index);
       }

   });
}

答案 2 :(得分:0)

当你在页面上使用巨大的代码时,它基本上就会发生.. 所以试着压缩这段代码