Зацикливание jquery ajax на основе ответа ajax .. с помощью setTimeout - PullRequest
1 голос
/ 21 августа 2011

Итак, я пытаюсь использовать одну функцию jquery, которая использует ajax для общения с одной страницей php, но вызывает разные шаги процесса.Если шаг процесса завершается успешно, он возвращает следующий шаг, чтобы я мог снова пройтись по этой функции ... пока не вернусь "завершено" или "не выполнено"Я хочу определить время определенных шагов процесса, чтобы учесть задержку обработки на стороне сервера.У меня возникли проблемы с использованием setTimeout внутри функции.У меня есть следующее:

    function ProcessClient(InProcess){
    var dataString = 'inprocess='+InProcess;
    if(InProcess=='buildaccount'){dataString+='&vercode='+$('#vercode').val();}

    //append current step(status) to client here

    $.ajax({             
        type: "POST",             
        url: 'ajax/NewClient.php',            
        data: dataString, 
        success: function(data){
            if(data=='Fail'){
                alert(data);
            }else if(data=='Complete'){
                $('#Progress').append('<li>All done! Click <a href="/manage/">here</a> to head over to your administration page!</li>');
            }else{
                var Timer = 1000;
                if(data=='buildserveraccounts'){
                    Timer=10000;
                }

                $(function(){
                    setTimeout('ProcessClient('+data+')',Timer);
                })
            }
        }
    });     
}

Что я здесь не так делаю?На данный момент ... функция даже не зацикливается ... Я пробовал несколько разных вещей и не могу заставить таймер работать.О, и я открыт для идей о лучших способах достижения того, что я пытаюсь ...?

1 Ответ

1 голос
/ 21 августа 2011

Этот код является подозрительным по двум причинам:

$(function(){
    setTimeout('ProcessClient('+data+')',Timer);
})

Во-первых, вы передаете функцию в $(), что является сокращением для $(docmument).ready(...)- Например, крюк «Позвони мне, когда ДОМ будет готов».Этот код не имеет ничего общего с готовым DOM.Это было бы относительно безопасно, потому что, если DOM уже готов, jQuery немедленно вызывает функцию, но в лучшем случае она не нужна.

Во-вторых, вы передаете строку в setTimeout.Почти никогда нет веских причин для этого, это то же самое, что использовать eval (но с задержкой), который также почти никогда не имеет смысла использовать.Вместо этого передайте ссылку на функцию.

Итак:

setTimeout(function() {
    ProcessClient(data);
}, Timer);

Я ожидаю, что причина, по которой он вообще не работал, заключалась в том, что строка, в которую вы передавали setTimeout, была ProcessClient(SomeDataTest) вместо ProcessClient("SomeDataTest") (обратите внимание на кавычки), и поэтому, когда строка вычислялась позже, это была синтаксическая ошибка и не выполнялась.

...