Использование цикла for с проблемой ajax

Я создаю полный календарь для создания событий. Я получаю значение из 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 + "'";
                }
            });
        });

Пожалуйста, помогите решить эту проблему.

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

T.J. Crowder 27.03.2018 09:01
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
1
37
1

Ответы 1

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. Здесь не нужен другой ответ, просто закрытое голосование (и при необходимости комментарий). :-)

T.J. Crowder 27.03.2018 09:00

@CertainPerformance Тем не менее, это то же самое, без изменений

Milind 27.03.2018 09:02

@ T.J. Причина, по которой я спрашиваю Crowder, заключается в том, что у меня есть функция ajax, и я не нашел ничего для цикла for с ajax. Так что позвольте эксперту ответить

Milind 27.03.2018 09:03

@Milind: Эксперты имеют широко ответили в ответах на связанный вопрос. Как я указал в комментарии к вопросу, проблема в том, что вы создаете в цикле функции (например, которые вызываются позже), которые используют переменные, которые цикл изменяет. Если вы прочтете вопрос и ответы на него, он подскажет, что с этим делать.

T.J. Crowder 27.03.2018 09:05

Я нашел способ, если вы используете jQuery для каждого, чем он может вам помочь

Milind 06.04.2018 20:29

Другие вопросы по теме