2016-03-11 3 views
0

Есть ли способ для меня запускать коды асинхронно в цикле for?Javascript асинхронный для цикла

В этом примере событие от дня х к у требуется для добавления в календарь через цикл. Однако цикл занимает около минуты и слишком длинный, так как требуется пройти все дни с 4 января 2016 года по 28 декабря 2020 года.

Прямо сейчас, мне придется подождать всех дни для загрузки, чтобы просмотреть результат. Есть ли способ для добавления событий и появления сразу после запуска 'addEventSource'/до того, как он пройдет весь цикл. Возможно ли сделать это асинхронным?

Javascript

$(document).ready(function() { 
     loadCalendar(null); 
     var start = new Date("Jan 4, 2016 08:00:00"); 
     var end = new Date("Dec 28, 2020 12:00:00"); 
     var startTime = new Date("Jan 4, 2016 08:00:00"); 
     var endTime = new Date("Jan 4, 2016 12:00:00"); 

     addCalendarEvents("Test", start, end, startTime, endTime); 
    }); 

function addCalendarEvents(title, start, end, repeatDays, startTime, endtime) { 
     var events = []; 

     var one_day = (24 * 60 * 60 * 1000); 
     var loopEnd = end.getTime(); 

     for (var loop = start.getTime() ; loop <= loopEnd; loop = loop + one_day) { 
      var eventDate = new Date(loop); 

       var tempStart = start; 
       var tempEnd = end; 

       tempStart.setDate(eventDate.getDate()); 
       tempStart.setMonth(eventDate.getMonth()); 
       tempStart.setFullYear(eventDate.getFullYear()); 
       tempEnd.setDate(eventDate.getDate()); 
       tempEnd.setMonth(eventDate.getMonth()); 
       tempEnd.setFullYear(eventDate.getFullYear()); 

       $('#calendar').fullCalendar('addEventSource', [{ 
        title: title, 
        start: tempStart, 
        end: tempEnd, 
        allDay: false 
       }]); 

     } 
    } 

P.S. $('#calendar').fullCalendar('addEventSource', event) adds events to the calendar.

+0

Почему вы пытаетесь добавить целые события календаря на один раз? Почему бы не добавить только месяц просмотра? Детали, полученные от службы, могут храниться локально, чтобы избежать звонков в службу с каждым изменением месяца. –

+0

@RavitejaAvvari. Это не единственная проблема, даже если события только для месяца просмотра добавляются, для этого требуется огромное количество времени, когда большой кусок событий необходимо загрузить. Что делать, если повторные события повторяются, проблема все равно будет сохраняться. События также не могут храниться локально, поскольку они должны быть динамическими, и я планирую также запустить функцию addCalendarEvents с сервера. – WaftureRobin

+0

Если ваши события (или будут собираться) сохранены на вашем сервере, это серверный бизнес для извлечения событий. На стороне клиента (js) вам просто нужно сказать: «Эй, я прошу события с мая 2018 года или что-то еще». Запросите его на сервер, сервер вернет вам события, затем отобразится. Я думаю, что ваш подход не так хорош, как говорит @RavitejaAvvari, вам действительно не нужно «все» до 2020 года! – Julo0sS

ответ

0

Как уже упоминалось Tibrogargan, это может быть достигнуто с помощью SetTimeout/setInterval.

Идея состоит в том, чтобы запустить цикл for в течение определенного времени и разбить цикл. снова запускает цикл через определенное время, с которого он остановился раньше. Таким образом, вы не будете блокировать пользователя.

например ..

var thresholdTime = 500; 
function searchForData(searchTerm, indexFromWhereToSearch) { 
    var startTime = new Date(), 
    searchFrom = indexFromWhereToSearch; 
    for (var i=searchFrom; i < hugeData.length; i++) { 
    ....... 
    if (newDate() - startTime >= thresholdTime) { 
     setTimeout((function(index) { 
     return function() { 
      searchForData(searchTerm, index); 
     } 
     })(i+1), 300/*another threshold*/); 
     break/return; 
    } 
    } 
} 
+0

Похоже, что это сработает, но я не знаю, как это применить к моему коду? Не возражаете ли вы изменить их для меня? Благодаря! :) – WaftureRobin

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