未完成前重新执行功能
问题描述:
我有一个包含数百行的JS函数。我需要确保函数在完成前一次调用之前不会再次调用。未完成前重新执行功能
所以,我想这一点:
var executing = false;
function myFunc(){
//stop executing if it's already executing
if(executing){
return false;
}
executing = true;
/* the main function with ajax-calls etc */
$.ajax({
type: "POST",
url: "/"+method+action,
data: "a=1",
success: function(data){
//the inner function logic...
executing = false;
}
}
确实看起来假的呀?我的缺点在哪里?如果你认为这是有道理的,也许这个错误是在没有发布的代码中的其他地方。感谢您的反馈意见!
答
尝试添加async
选项的jQuery ajax并将其设置为false,使同步请求:
$.ajax({
type: "POST",
async :false,
url: "/"+method+action,
data: {a:1},
success: function(data){
//the inner function logic...
executing = false;
}
提供的片段“将工作”预期*除非*其他代码与它干扰。但是,有些情况需要考虑:1.其他情况会改变“执行”(请记住,在AJAX调用完成之前可以触发其他事件)。另外'执行'在任何更大范围内都是无用的通用名称; 2)当AJAX呼叫失败时会发生什么? 3)排队? 4)*修正*语法错误(例如,不关闭''')。 – user2246674
谢谢。没有别的改变“执行”。如果ajax调用会失败,那么就不会有问题,因为这些项目不会被添加(我使用这个来加载无数滚动中的更多项目)。排队?你能解释一下吗? –
您可能不想放弃下一个请求 - 想象用户自动完成某些事情,他们键入X(启动AJAX调用),然后XY - 您希望它最终显示改进为XY(木琴)的单词,不只是X(氙气)。处理这个微不足道的例子的一个简单方法是取消优秀的XHR调用 - 也许使用XHR对象作为标记(而不是单独的布尔)。 – user2246674