2014-10-30 3 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 является однопоточным. –

+0

Если функция работает или нет, ее можно разрешить с помощью флагов, функция остановки - невозможна. «бегать один раз в раз» - очень неясно - один раз в цикле? раз в какое-то время? – Evgeniy

ответ

0

JavaScripts однопоточные, и обратные вызовы должны использоваться для обеспечения асинхронного поведения. У вашей функции нет обратных вызовов. Из-за того, что она работает так, как вы хотите ..

+0

Обратные вызовы не создают параллелизма. –

+0

По моим сведениям, обратные вызовы используются для создания мультиплексирования с временным разделением в однопоточном цикле событий. Это создает параллелизм ... Где я ошибаюсь? –

+0

Обратные вызовы - это просто способ передать действие вместо значения. Это не имеет никакого отношения к времени или параллелизму. Вы не можете иметь параллелизм с одним потоком. –

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/

ИЛИ __________________________________________________________________-

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 
    } 
}