Javascript异步for循环
我有没有办法在for循环中异步运行代码 在此示例中,需要通过for循环将日期x到y的事件添加到日历中。然而,该循环大约需要一分钟,而且太长,因为它需要经历并添加从2016年1月4日到2020年12月28日的所有天数 现在,我将不得不等待所有的日子来加载查看结果。 是否有一种方法可以在触发“addEventSource”后/在它通过整个循环之前添加并显示事件。有可能使它异步吗 JavascriptJavascript异步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
$(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;
}
}
}