2016-02-14 3 views
0

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

4/4: Adding events for week 9 [###################] 12/12 
1/4: Adding events for week 6 [###################] 20/20 
2/4: Adding events for week 7 [###################] 32/32 
3/4: Adding events for week 8 [###################] 40/40 

или если я печатать каждую строку из вместо обновления строки

4/4: Adding events for week 9 [##########   ] 6/12 
2/4: Adding events for week 7 [##     ] 1/32 
2/4: Adding events for week 7 [###    ] 2/32 
2/4: Adding events for week 7 [#####    ] 3/32 
1/4: Adding events for week 6 [###    ] 1/20 
1/4: Adding events for week 6 [#####    ] 2/20 
2/4: Adding events for week 7 [######    ] 4/32 
2/4: Adding events for week 7 [########   ] 5/32 
2/4: Adding events for week 7 [#########   ] 6/32 
3/4: Adding events for week 8 [#     ] 1/40 
3/4: Adding events for week 8 [###    ] 2/40 
3/4: Adding events for week 8 [####    ] 3/40 
4/4: Adding events for week 9 [############  ] 7/12 
4/4: Adding events for week 9 [#############  ] 8/12 
4/4: Adding events for week 9 [################# ] 9/12 

это не должно произойти, он должен сначала добавить все события в течение недели 6, затем 7 и так далее.

Я хочу пробег следующей функции в очереди, когда добавляется событие (асинхронный), основанная на этом https://stackoverflow.com/a/3584027/3774580 менеджера очередей (изменил его немного.)

var Queue = function(){ 
    this.queue = []; 
    this.index = 0; 
    this.cb = function(){}; 
}; 

Queue.prototype = { 
    add: function(fn){ 
     this.queue.push({ 
      fn: fn 
     }); 
    }, 
    run: function(index){ 
     (index || index === 0) && (this.index = index); 
     this.next(); 
    }, 
    next: function(){ 
     var self = this, 
      i = this.index++, 
      at = this.queue[i], 
      next = this.queue[this.index]; 

     if(at){ 
      at.fn(); 
     } 
     if(next){ 
      self.next(); 
     }else if(this.index == this.queue.length){ 
      this.cb.call(this); 
     } 
    }, 
    reset: function(){ 
     this.index = 0; 
    }, 
    onEnd: function(callback){ 
     this.cb = callback; 
    } 
}; 

все работало нормально с таймаутами во время тестирования я заменил тайм-аут на очередь, чтобы минимизировать потраченное впустую время, ожидая следующей итерации. так это работало:

var timeout = 0; 
weeks.forEach(function(week, index){ 
    setTimeout(function() { 
     webuntis.fetchWeek(week, class_id, function(event){ /* ... */ }); 
    }, timeout); 
    timeout += 3000; 
}); 

здесь, где я использую его, попытался добавить в 500мс тайм-аут как тест

var WeekQueue = new Queue(); 
weeks.forEach(function (week, index) { //weeks = array with Date objects 
    WeekQueue.add(function() { 
     webuntis.fetchWeek(week, result.class_id, function (events) { //asyc callback 
      var EventQueue = new Queue(), 
       bar = new ProgressBar((index + 1) + '/' + weeks.length + ': Adding events for week ' + week.getWeek(1) + ' [:bar] :current/:total', {/* config removed */}); 

      for (var e in events) { 
       EventQueue.add(function() { 
        var event = events[e]; /* rest of vars removed */ 
        icloud.addEvent(cal_ref, event.uid, start, end, description, event.zone[0], event.title[0], function (err, res) { //async callback 
         if (!err) { 
          bar.tick(); 
          setTimeout(function() { 
           EventQueue.next() 
          }, 500); 
         } 
        }); 
       }); 
      } 
      EventQueue.onEnd(function() { 
       setTimeout(function() { 
        WeekQueue.next() 
       }, 500); 
      }); 
      EventQueue.run(); 
     });// /webuntis.fetchWeek 
    });// /WeekQueue.add 
});// /weeks.forEach 
WeekQueue.run(); 

, что я делаю не так?

+0

Вы должны использовать библиотеку для управления потоком асинхронного вместо того, чтобы играть с тайм-аутом. Async очень хорош в этом, и есть помощник очереди: https://github.com/caolan/async#queue – Shanoor

+0

Спасибо, я дам вам попробовать – keja

ответ

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