使用setTimeout基于ajax响应循环jquery ajax

时间:2011-08-21 07:32:36

标签: php jquery ajax settimeout

所以我正在尝试使用单个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 个答案:

答案 0 :(得分:1)

此代码有两种可疑方式:

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

第一件事是你将一个函数传递给$(),这是$(docmument).ready(...)的简写 - 例如,“当DOM准备就绪时给我打电话”。此代码与DOM就绪无关。这在这里相对无害,因为如果DOM已经准备就绪,jQuery会立即调用该函数,但它最多也是不必要的。

第二件事是你将一个字符串传递给setTimeout。几乎没有一个很好的理由这样做,它与使用eval(但有延迟)相同,这也几乎没有理由使用。相反,传入一个函数引用。

所以:

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

我预计它根本不起作用的原因是你传入setTimeout的字符串是ProcessClient(SomeDataTest)而不是ProcessClient("SomeDataTest")(注意引号),所以当字符串后来被评估,这是一个语法错误,没有执行。