Пост AJAX рекурсии, заставляющий компьютер работать медленно - PullRequest
0 голосов
/ 15 июля 2010

У меня есть этот цикл рекурсии, где внутри функции у меня есть как минимум 2 ajax get / post, и рекурсия происходит после первого получения ajax. моя структура функций такая,

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 ]

2 голосов
/ 15 июля 2010

Ваш 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 голосов
/ 15 июля 2010

Прежде всего эта строка:

   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 сек. Я думаю, это именно то, что вы хотели получить. Здесь нет причин делать рекурсивный вызов.

0 голосов
/ 15 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...