Я создаю полный календарь для создания событий. Я получаю значение из rest api из даты начала и окончания цикла. Моя идея состоит в том, что когда в этот день нет данных, я хочу показать событие и свободный день, но всегда получаю дату окончания цикла. Пожалуйста, расскажите, что я могу сделать, чтобы получить дополнительную ценность.
Я уверен, что у него есть асинхронная проблема с ajax из-за того, что это происходит. Мне просто нужна помощь для этого
Мои коды
var startDate = calendar.fullCalendar('getView').start;
var endDate = calendar.fullCalendar('getView').end;
$.ajax({
url: "/_api/lists/getbytitle('Item')/items?$select=Title,Category&$orderby=Category&$filter=Category eq '" + $("#items").val() + "'",
method: "GET",
headers: { "Accept": "application/json; odata=verbose" }
}).then(function (data) {
var promises = data.d.results.map(function (item, i) {
var _url = "/_api/lists/getbytitle('ItemRequestLog')/items?$select=Title,ItemRequest/Title,DateRequestedFrom,DateRequestedTo&$expand=ItemRequest&$filter=Title eq '" + item.Title + "'";
for (var d = new Date(startDate.format()); d < new Date(endDate.format()); d.setDate(d.getDate() + 1)) {
var e = moment(d).add(1, 'days'); console.info(d) //here value is good
_url += " and (DateRequestedFrom ge datetime'" + d.toISOString() + "') and (DateRequestedTo le datetime'" + e.toISOString() + "')";
$.ajax({
url: _url,
method: "GET",
headers: { "Accept": "application/json; odata=verbose" }
}).then(function (data) {
if (data.d.results.length == 0) {
console.info(d) //here I am getting end of the loop value
event.title = item.Title;
event.start = d;
event.end = e;
event.allDay = true;
event.color = "yellow";
$('#calendar').fullCalendar('renderEvent', event, true);
}
var promises = data.d.results.map(function (itemLog, i) {
event.title = itemLog.Title;
event.start = moment(itemLog.DateRequestedFrom);
event.end = moment(itemLog.DateRequestedTo);
event.allDay = false;
event.color = "red";
$('#calendar').fullCalendar('renderEvent', event, true);
});
})
_url = "/_api/lists/getbytitle('ItemRequestLog')/items?$select=Title,ItemRequest/Title,DateRequestedFrom,DateRequestedTo&$expand=ItemRequest&$filter=Title eq '" + item.Title + "'";
}
});
});
Пожалуйста, помогите решить эту проблему.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


var поднимается и имеет область действия, а не область блока: в асинхронном коде, если вы используете цикл for, обязательно используйте let, таким образом, каждая итерация цикла будет иметь отдельную привязку для рассматриваемой переменной .
Изменять
for (var d = new Date(startDate.format()); d < new Date(endDate.format()); d.setDate(d.getDate() + 1)) {
к
for (let d = new Date(startDate.format()); d < new Date(endDate.format()); d.setDate(d.getDate() + 1)) {
Это один из самых повторяющихся вопросов в теге JavaScript. Здесь не нужен другой ответ, просто закрытое голосование (и при необходимости комментарий). :-)
@CertainPerformance Тем не менее, это то же самое, без изменений
@ T.J. Причина, по которой я спрашиваю Crowder, заключается в том, что у меня есть функция ajax, и я не нашел ничего для цикла for с ajax. Так что позвольте эксперту ответить
@Milind: Эксперты имеют широко ответили в ответах на связанный вопрос. Как я указал в комментарии к вопросу, проблема в том, что вы создаете в цикле функции (например, которые вызываются позже), которые используют переменные, которые цикл изменяет. Если вы прочтете вопрос и ответы на него, он подскажет, что с этим делать.
Я нашел способ, если вы используете jQuery для каждого, чем он может вам помочь
Функции, которые вы создаете внутри цикла, используют переменные, которые вы изменяете в цикле. Посмотрите ответы на связанный вопрос, чтобы узнать, почему это вызывает проблемы и что с этим делать.