0

Здравствуйте! В коде есть цикл for со счётчиком j. В теле цикла выполняется глобально определённая функция example(), длительность выполнения которой составляет от 24 секунд.

example = function(d) {};   

$('#button').click(function(){
    for (j; j<=num; j++) {
        example(j); 
    };      
});

При выполнение цикла возникает проблема. Цикл выполняется очень быстро, создавая num-е число считай параллельных запусков функции example(). Как сделать ожидание завершения функции example() и только потом продолжить цикл и инкрементировать j. Функция example ничего не возвращает, но если надо могу дописать return.

UPD1: Видя бурные обсуждения, скидываю код функции.

example = function(d) {                 
    function startTrackInterval(day) {
      if (day) effectController.day=day;
      effectController.hour=0;
      var timerId = setInterval(function() {
        if (effectController.hour > 24) clearInterval(timerId);
        else {
        gui.updateDisplay();
        tracker();
        };
        effectController.hour=effectController.hour+0.01;
      }, 10);
    }
    startTrackInterval(d);
}   
Grundy
  • 81,538
  • 3
    Javascript однопоточный. Его нельзя приостанавливать по частям. – vp_arth Feb 22 '17 at 04:57
  • Если в example нет ничего асинхронного, то тогда цикл будет дожидаться выполнения example и только потом переходить на новую итерацию. Покажите код example – ThisMan Feb 22 '17 at 05:35
  • в example, скажем так, графическая программа, на её выполнение уходит прилично времени – Александр Беляков Feb 22 '17 at 05:37
  • @АлександрБеляков, нам не важно сколько времени на нее уходит, вопрос в том, какие операции там выполняются: синхронные или асинхронные – ThisMan Feb 22 '17 at 05:38
  • @ThisMan не особо разбираюсь в понятиях сихронности и асинхронности, скажу только что сервера нет, весь код на js, через который происходит обращение к WebGL. Нужно просто дождаться текущего выполнения функции example() и только потом переходить к следующему. Если представить, что WebGL не входит в JS, то операции асинхронны. – Александр Беляков Feb 22 '17 at 05:47
  • @АлександрБеляков, боюсь что без кода вам сложно будет ответить – ThisMan Feb 22 '17 at 05:51
  • может тогда лучше передать num в example и уже там использовать цикл? – ordman Feb 22 '17 at 06:54
  • 1
    добавь пример функции example – Grundy Feb 22 '17 at 07:56
  • @PavelMayorov, думаешь? тут же скорее про организацию очереди из num асинхронных вызовов – Grundy Feb 22 '17 at 07:58
  • Моя телепатия подсказывает мне, что если бы функция example была синхронной - у автора не было бы проблемы с параллельными запусками. Значит, она асинхронная. – Pavel Mayorov Feb 22 '17 at 07:59
  • @PavelMayorov, но ему не нужен результат функции, ему нужно чтобы они запускались по очереди – Grundy Feb 22 '17 at 07:59
  • @Grundy ему нужно дождаться окончания выполнения. Это частный случай получения результата. – Pavel Mayorov Feb 22 '17 at 08:00
  • @Grundy добавил функцию example – Александр Беляков Feb 22 '17 at 09:35
  • @АлександрБеляков, ой как тут все плохо. Что именно в этом коде длится 24 секунды? В любом случае - ответы в вопросе-дубликате должны помочь тебе разобраться что у тебя происходит – Grundy Feb 22 '17 at 10:35

1 Answers1

0

Можно попробывать так:

var i = 1;                     
var rtr = 0;
var num = 5;
function myLoop () {           
   setTimeout(function () {    
      example(i);           
      i++;                     
      if (i < num) {           
         myLoop();             
      }                     
   }, 25000)              // Время выполнения функции
}

myLoop();  
L. Vadim
  • 3,416