2014-10-30 124 views
0

假设我有这个简单的JavaScript函数:JavaScript - 如何创建一次只能运行一次的函数?

var exclusiveFunction = function(){ 
    for(index in firstArray) 
    { 
     for(secondIndex in firstArray[index]) 
     { 
      // do stuff to firstArray[index][secondIndex] 
     } 
    } 
} 

我的问题:有一个机会,这个代码被多次调用前一个呼叫可以完成整个功能。我想什么:

if(exclusiveFunction.workingAtTheMoment) 
{ 
     exclusiveFunction.stopFunction(); 
     exclusiveFunction(); 
} 

基本上,检查功能正在运行,如果是,停止它(和它运行的每个实例),并再次启动它。这可能吗?

+3

JavaScript是单线程的。 – 2014-10-30 12:17:42

+0

如果函数正在运行,可以用标志来解决,停止函数 - 不可能。 “一次运行一次” - 非常不清楚 - 一次循环?每次一次? – Evgeniy 2014-10-30 13:01:22

回答

0

JavaScripts是单线程的,应该使用回调来提供异步行为。你的函数没有任何回调。因为它的工作在你想要的方式..的

+0

回调不会产生任何并发。 – 2014-10-30 12:28:25

+0

据我所知,回调用于在单线程事件循环中创建时分复用。这会产生并发性...我错在哪里? – 2014-10-30 12:36:19

+0

回调只是一种传递行为而不是价值的方式。它与时间或并发无关。您不能使用单个线程进行并发。 – 2014-10-30 15:19:06

0

您可以使用varible保持功能excetuion的轨道

var isFunRunning =0; 

var exclusiveFunction = function(){ 
if(isFunRunning==0) 
{  
    isFunRunning =1;  
    for(index in firstArray) 
     { 
      for(secondIndex in firstArray[index]) 
      { 
       // do stuff to firstArray[index][secondIndex] 
      } 
     } 
    isFunRunning=0; 
} 
else { 

//code to keep count of function triggered in between 

} 
     } 

,或者通过走这 http://api.jquery.com/jquery.callbacks/

OR __________________________________________________________________-

var callbacks = $.Callbacks(); 
var count =0; 

var exclusiveFunction = function(){ 

    if(isFunRunning==0) 
    {  
     isFunRunning =1;  
     for(index in firstArray) 
      { 
       for(secondIndex in firstArray[index]) 
       { 
        // do stuff to firstArray[index][secondIndex] 
       } 
      } 
     isFunRunning=0; 
    } 
    else { 

     callbacks.add(exclusiveFunction); 
     count ++; 

    } 
      } 

然后触发回拨

0

我不确定是否有机会创建并行函数(可能是事件或异步;我对这个想法不感兴趣),但是你可以停止这样的功能:

window.someCounter = 0; 
function doSomethingUntilOtherCall(){ 
    var myID = ++window.someCounter; 
    while (myID === window.someCounter){ 
     // do something 
    } 
}