Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript异步for循环_Javascript_Jquery_Performance_For Loop_Asynchronous - Fatal编程技术网

Javascript异步for循环

Javascript异步for循环,javascript,jquery,performance,for-loop,asynchronous,Javascript,Jquery,Performance,For Loop,Asynchronous,我有没有办法在for循环中异步运行代码 在此示例中,需要通过for循环将日期x到y的事件添加到日历中。然而,该循环大约需要一分钟,而且太长,因为它需要经历并添加从2016年1月4日到2020年12月28日的所有天数 现在,我将不得不等待所有的日子来加载查看结果。 是否有一种方法可以在触发“addEventSource”后/在它通过整个循环之前添加并显示事件。有可能使它异步吗 Javascript $(document).ready(function () { loadCalend

我有没有办法在for循环中异步运行代码

在此示例中,需要通过for循环将日期xy的事件添加到日历中。然而,该循环大约需要一分钟,而且太长,因为它需要经历并添加从2016年1月4日到2020年12月28日的所有天数

现在,我将不得不等待所有的日子来加载查看结果。 是否有一种方法可以在触发“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
                }]);

        }
    }
$(文档).ready(函数(){
加载日历(空);
风险值开始=新日期(“2016年1月4日08:00:00”);
var结束=新日期(“2020年12月28日12:00:00”);
var startTime=新日期(“2016年1月4日08:00:00”);
var endTime=新日期(“2016年1月4日12:00:00”);
addCalendarEvents(“测试”、开始、结束、开始时间、结束时间);
});
函数addCalendarEvents(标题、开始、结束、重复日、开始时间、结束时间){
var事件=[];
var一天=(24*60*60*1000);
var loopEnd=end.getTime();

对于(var loop=start.getTime();loopJavascript没有线程模型,但它有异步计时器


检查一下:

正如Tibrogargan提到的,可以使用setTimeout/setInterval来实现

我们的想法是运行for循环一段时间,然后中断循环。在一定时间后,从之前停止的地方再次触发循环。这样,您就不会阻止用户

例如

var阈值时间=500;
函数searchForData(searchTerm,indexfromWhere搜索){
var startTime=新日期(),
searchFrom=从何处搜索的索引;
for(var i=searchFrom;i=阈值时间){
setTimeout((函数(索引){
返回函数(){
searchForData(searchTerm,索引);
}
})(i+1),300/*另一阈值*/);
中断/返回;
}
}
}

为什么要一次添加整个日历事件?为什么不只为查看月份添加?从服务接收的详细信息可以存储在本地,以避免每个月的服务调用change@RavitejaAvvari这不是唯一的问题,即使只添加观看月份的活动,也需要花费大量的时间en需要加载大量事件。如果有更多重复的事件,问题仍然会存在。事件不能在本地存储,因为它们需要是动态的,我也计划从服务器启动addCalendarEvents函数。如果您的事件是(或将是)存储在您的服务器上,这是检索事件的服务器端业务。客户端(js)您只需要告诉:“嘿,我请求2018年5月的事件,或者其他什么”。请求到服务器,服务器返回事件,然后您显示。我认为您的方法不如@RavitejaAvvari所说的好,您实际上不“需要”到2020年,一切都会好起来!那我该怎么申请呢?你介意把代码打出来吗?听起来好像行得通,但我是新来的,我该怎么申请我的代码呢?你介意帮我修改吗?谢谢!)
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;
    }
  }
}