2014-01-08 3 views
4

Каков наилучший способ выполнения функции до завершения вызова?Подождите, пока функция не завершится

функции Пример JavaScript:

var notifyState = function(state) { 
setTimeout(function() { 
    /*Do something*/ 
}, 2000); 
}; 

Тогда я вызываю функцию дважды:

notifyState('State1'); 
notifyState('State2'); 

Эта функция исполняющие в paraller. Какой лучший способ выполнить их последовательно? Я могу только изменить функцию notifyState. notifyState может выполняться только с одним параметром.

Обновление: Функция notifyState сообщает, что фактическое состояние в флеш игры. Он сохраняет его в html-коде, когда состояние изменяется, тогда состояние переопределяется. В тесте selenium я загружаю состояние из html-кода, но состояние меняет слишком быстро, что селен этого не заметил, поэтому я попробовал спящий JavaScript.

+9

время для 'обратного вызова' – Praveen

+0

Прежде всего ...в javascript нет многопоточности, поэтому ваша функция всегда будет выполняться последовательно, но вы не можете сказать, в каком порядке – SOReader

+0

@PraveenJeganathan: Обратный вызов не будет работать, если OP может только модифицировать функцию «notifyState» – musefan

ответ

6

Это зависит от того, хотите ли вы #notifyState использовать setTimeout или нет. Если вам не нужен SetTimeout тогда вы просто переписать следующим образом:

var notifyState = function(state) { 
    /* Do something */ 
} 

notifyState('State 1'); 
notifyState('State 2'); 

Если вы хотите сохранить SetTimeout и цепь на звонки, так что вторая уведомлять выполняется после первого вы должны предоставить обратный вызов:

var notifyState = function(state, callback) { 
    setTimeout(function() { 
    /* Do something */ 
    if (callback) { 
     callback(); 
    } 
    }, 2000); 
} 

notifyState('State 1', function() { 
    notifyState('State 2'); 
}); 

EDIT

Кажется, что проблема ОП отличается. Мое понимание заключается в том, что вы предоставляете #notifyState функцию как обратный вызов сторонней Flash, которую вы не контролируете, и вы хотите, чтобы вызовы notifyState выполнялись в том же порядке и один за другим, поэтому вы не имеют 2 параллельных звонка notifyState работает в то же время. Для этого вам необходимо ввести очередь, которая будет сохранять состояния и изменить функцию notifyState, чтобы выполнить только одно состояние в то время. Я предполагаю, что ваша потребность в setTimeout здесь важна и держит ее таким образом. См. Код ниже:

var Queue = [], 
    running = false; 
var notifyState = function(state) { 
    if (running) { 
    Queue.push(state); 
    } else { 
    running = true; 
    setTimeout(function() { 
     /* Do something */ 
     running = false; 
     var nextState = Queue.pop(); 
     if (nextState) { 
     notifyState(nextState); 
     } 
    }, 2000); 
    } 
} 
+0

Я могу выполнить 'notifyState' только с одним параметром (фактическое состояние). Я не знаю, какое состояние будет дальше. – estradowiec

2

Добавьте необязательный параметр, который будет действовать как функция обратного вызова. Убедитесь, что параметр является фактически функцией, если это так, запустите его.

var notifyState = function(state,fn) { 
    setTimeout(function() { 
     /*DoSomething*/ 
     if(typeof(fn)=='function'){ fn(); } 
    }, 2000); 
}; 

Вы можете вызывать функции следующим образом:

notifyState('State1', function(){ 
    notifyState('State2'); 
}); 

JSFiddle

+1

, но Op упомянутый 'может только модифицировать функцию notifyState.' Поэтому я думаю, что OP не может использовать его – Praveen

+0

Таким образом, OP может самостоятельно изменить функцию, но не вызов функции? – George

+0

на основе вопроса, похоже, что только ОП может его прояснить. – Praveen

0
var notifyState = function(state, callback) { 
    setTimeout(function() { 

    /*Do something*/ 

    callback(); 

    }, 2000); 
}; 

Вызов функции:

var state1CompleteHandler = function() { 
    // code to execute when state 1 logic completes 
    notifyState('State2'); 
} 
notifyState('State1', state1CompleteHandler); 
Смежные вопросы