使用带有ajax问题的for循环

时间:2018-03-27 06:55:17

标签: javascript jquery for-loop fullcalendar

我正在创建fullcalendar来创建事件。我从循环开始日期和结束日期得到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.log(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.log(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 + "'";
                }
            });
        });

请帮助解决它。

1 个答案:

答案 0 :(得分:0)

var被提升,并且具有函数作用域,而不是块作用域:在异步代码中,如果你使用for循环,请确保使用let,这样,每次迭代loop将对所讨论的变量有一个单独的绑定。

更改

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)) {