所以我正在尝试使用单个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);
})
}
}
});
}
我在这里做错了什么?截至目前...功能甚至没有循环..我尝试了一些不同的东西,永远不会让计时器工作。哦,我愿意接受有关更好地实现我想要的方法的想法......?
答案 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")
(注意引号),所以当字符串后来被评估,这是一个语法错误,没有执行。