Вызов ASP.NET Webservice в цикле javascript вызывает проблемы - PullRequest
0 голосов
/ 08 сентября 2011

Я строю календарь в javascript / asp.net.

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

for (var i = 1; i <= monthdays[month - 1]; i++) {
        curnum++;
        td = tr.insertCell(-1);
        td.style.height = "95px";
        td.style.width = "131px";
        html = "<div id=\"divday" + year + "" + month + "" + i + "\" style=\"position:relative; left:0px; top:0px; width130px; height:95px; background-color:" + colors[i % 2] + "; cursor:pointer; \" onclick=\"openDay(" + year + "," + (month < 10 ? "0" + month : month) + "," + (i < 10 ? "0" + i : i) + ")\">";
        html += "<div class=\"blackl\" style=\"position:absolute; left:100px; top:0px; width:30px; height:20px; text-align:right; \">" + i + "</div>";
        html += "</div>";
        td.innerHTML = html;
        if (curnum == 7) {
            tr = tbl.insertRow(-1);
            curnum = 0;
        }
        if(i == 1) RCalendar.GetCalendarEvents(agentid, year, month, i, function (result) { setCalendarEvents(year, month, i, result) });

Последняя строка не должна иметь, если (i == 1) она только для отладки. Я хотел бы позвонить в веб-службу и написать элементы для evert day (i).

Вот функция обратного вызова:

function setCalendarEvents(y, m, d, result) {
    var daydiv = document.getElementById("divday" + y + m + d);
    for(var i = 0; i < result.length; i++) {
        var thiscalendaritem = result[i];
        daydiv.innerHTML += makeCalendarItem(thiscalendaritem);
    }
}

Если я поставлю точку останова, где вызывается веб-служба, и в функции обратного вызова, i и d не совпадают. Когда он вызывается, i равен 1 (очевидно), но в setCalendarEvents при его вызове d равен 31.

Ответы [ 2 ]

0 голосов
/ 08 сентября 2011

1) Если используется асинхронный вызов в следующей строке:

if(i == 1) RCalendar.GetCalendarEvents(agentid, year, month, i, 
                                       function (result) {
                                           setCalendarEvents(year, month, i, result)
                                       });

Попробуйте изменить, например, так:

if(i == 1) RCalendar.GetCalendarEvents(agentid, year, month, i, 
                                       setCalendarEvents.bind(null, year, month, i));

Когда setCalendarEvents вызывается после завершения асинхронного запроса, функция setCalendarEvents получает 4 параметра (год, месяц, i - без изменений) и result (последний параметр).

2) Проверьте следующие строки:

"<div id=\"divday" + year + "" + month + "" + i + ...

var daydiv = document.getElementById("divday" + y + m + d);

Для года: 2012, месяца: 1, дня: 12 - id равно divday2012112

Для года: 2012, месяца: 11, дня: 2 - id равно divday2012112 (аналогично предыдущему div)

0 голосов
/ 08 сентября 2011

Проблема в том, что вызов веб-метода является асинхронным. Итак, вы вызвали метод, но не дождались выполнения.

Посмотрите на эту статью, чтобы сделать синхронный вызов http://kpumuk.info/asp-net/synchronous-page-method-call-in-asp-net-ajax-library/

...