2013-08-01 3 views
0

У меня есть некоторые JavaScript функции вызывается на Документ Ready:Javascript - Порядок выполнения функций

fogFields(); 
getLoS(); 
getShips();  

startGame(); 
getNextMove(); 

Однако, это как бы getNextMove() вызывается первым, скорее всего, как все это делает это Аякс вызывать и предупреждать результат. Все остальные функции имеют больше работы, поэтому первое, что происходит при загрузке, - это предупреждение getNextMove(), и в фоновом режиме вы можете видеть, что ни одна из других функций не выполняла свою работу. Пока я не нажму OK в окне предупреждения, результаты не отображаются. Могу ли я сделать так, чтобы до тех пор, пока функция не завершится, следующий не начнется. Некоторые функции называют свои дополнительные функции до их завершения, и это работает в порядке, но я не могу сделать это со всем кодом ...

+0

Другие функции также делают обратные вызовы ajax? Если да, то заказ не может быть гарантирован. – Abhitalks

+0

Если функция имеет AJAX, она работает в фоновом режиме и продолжается с остальной функцией. 'alert' будет * приостанавливать * выполнение (но не AJAX) до тех пор, пока они не будут закрыты. –

+0

@abhitalks: Вы можете использовать очередь функций. –

ответ

3

Учитывая код в вашем вопросе, нет способа позвонить в getNextMove вызывается до startGame, вне зависимости от их содержимого.

Это может быть верно, что функция, которая была запланирована асинхронно (с помощью тайм-аута, AJAX обратного вызова и т.д.) вstartGame завершается в любое время до или после вызова getNextMove, но это отдельный вопрос. Чтобы решить эту проблему, нам нужно больше узнать о содержании функций.

+0

Да, другие функции имеют вызовы AJAX, нет тайм-аутов. –

+1

@ user1479059 Обратные вызовы (они сами по себе являются функциями) к вызовам AJAX вызывают после того, как функция верхнего уровня, отправившая вызов AJAX, завершена. Решение зависит от нескольких вещей. Должны ли обратные вызовы к более ранним функциям запускаться в определенном порядке по отношению друг к другу или когда угодно, до тех пор, пока оно не будет до 'getNextMove'? –

+0

Порядок вызовов AJAX (они на самом деле JQ AJAX) не имеет значения - я просто хочу, чтобы они исполнялись до функции getNextMove().Я также попытался поместить первые 3 функции в новый, называемый draw() - и getNextMove в gNM(), и вместо предупреждения я показываю результат getNextMove для div. –

0

Если у других функций есть вызов AJAX в них, то эти вызовы AJAX, безусловно, принимают аргумент обратного вызова, который выполняет функцию, когда вызов AJAX завершен. Теперь, если вы хотите каким-то образом выполнить свои функции, одна функция запускается, когда закончен вызов предыдущей функции AJAX, вы можете добавить дополнительный аргумент обратного вызова к своим собственным функциям, который затем будет передан на вызовы AJAX. Это должно иллюстрировать, что я имею в виду:

function logFields(callback) { 
    ajaxCall(callback); 
} 

function getLoS(callback) { 
    ajaxCall(callback); 
} 

function getShips(callback) { 
    ajaxCall(callback); 
} 

function startGame(callback) { 
    ajaxCall(callback); 
} 

function getNextMove() { 
} 

fogFields(function(){ 
    getLoS(function(){ 
     getShips(function(){ 
      startGame(function(){ 
       getNextMove(); 
      }); 
     }); 
    }); 
}); 
+0

Проблема заключается в том, что он делает ваши вызовы AJAX последовательными, а не параллельными, и действительно замедляет работу. Должно быть возможно сразу отправить все запросы AJAX и вызвать следующий обратный вызов в последовательности, как только он станет доступным. –

+0

Это правда. Но я не уверен, понимаю ли я ваше предложение. Что будет «следующим обратным вызовом», если вы сразу отправляете все запросы AJAX? Кроме того, я не уверен, что содержат AJAX-вызовы. Возможно, они содержат данные из результатов предыдущих вызовов. Но, конечно, было бы лучше иметь только один вызов AJAX, который просто делает все. – basilikum

+0

'var callbackSeq = [" logFields "," getLoS "," getShips "," startGame "]; var loadedCallbacks = {}; function runLoadedCallbacks (name, newestCallback) {...}; 'Обратный вызов каждого запроса AJAX содержит функцию, которая закрывает возвращаемые данные и строку идентификатора. Он передает эту функцию 'runLoadedCallbacks'. 'runLoadedCallbacks' добавляет функцию к объекту' loadedCallbacks' под ключом, соответствующим 'key', а затем начинает с начала' callbackSeq' запускает и удаляет столько функций, сколько может, ломается, когда обнаруживает имя, которое не является в 'loadedCallbacks'. –

0

Если все ваши функции используют вызов ajax, просто используйте обещания. Просто вернуть его, например:

function fogFields(){ 
    return $.ajax(); 
}; 

, а затем просто использовать .then:

fogFields().then(getLos()); 

Более подробная информация о deffered объекта на jquery doc page, если вы его используете. Или реализация в чистом javascript вы найдете here и больше теории here.
или другой вариант, который я не буду рекомендовать вам, - установить async param в $ .ajax call to false. Опять же, для случая, когда вы используете jQuery.

Смежные вопросы