2013-05-30 103 views
0

我有一个包含数百行的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; 
     } 
} 

确实看起来假的呀?我的缺点在哪里?如果你认为这是有道理的,也许这个错误是在没有发布的代码中的其他地方。感谢您的反馈意见!

+2

提供的片段“将工作”预期*除非*其他代码与它干扰。但是,有些情况需要考虑:1.其他情况会改变“执行”(请记住,在AJAX调用完成之前可以触发其他事件)。另外'执行'在任何更大范围内都是无用的通用名称; 2)当AJAX呼叫失败时会发生什么? 3)排队? 4)*修正*语法错误(例如,不关闭''')。 – user2246674

+0

谢谢。没有别的改变“执行”。如果ajax调用会失败,那么就不会有问题,因为这些项目不会被添加(我使用这个来加载无数滚动中的更多项目)。排队?你能解释一下吗? –

+1

您可能不想放弃下一个请求 - 想象用户自动完成某些事情,他们键入X(启动AJAX调用),然后XY - 您希望它最终显示改进为XY(木琴)的单词,不只是X(氙气)。处理这个微不足道的例子的一个简单方法是取消优秀的XHR调用 - 也许使用XHR对象作为标记(而不是单独的布尔)。 – user2246674

回答

0

尝试添加async选项的jQuery ajax并将其设置为false,使同步请求:

$.ajax({ 
     type: "POST", 
     async :false, 
     url: "/"+method+action, 
     data: {a:1}, 
     success: function(data){ 
     //the inner function logic... 
     executing = false; 
     }