【问题标题】:Calling ASP.NET Webservice in javascript loop causes problems在 javascript 循环中调用 ASP.NET Webservice 会导致问题
【发布时间】:2011-09-08 09:46:15
【问题描述】:

我正在用 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) });

最后一行不应该有 if (i == 1) 它只是为了调试。我想调用网络服务并为每一天 (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);
    }
}

如果我在调用 web 服务的地方和回调函数中设置断点,i 和 d 就不一样了。当它被调用时,i 是 1(很明显),但是在 setCalendarEvents 中,当它被调用时,d 是 31。

【问题讨论】:

    标签: javascript asp.net web-services for-loop


    【解决方案1】:

    web方法调用异步的问题。所以你已经调用了方法,但没有等待完成。

    看这篇文章让同步调用http://kpumuk.info/asp-net/synchronous-page-method-call-in-asp-net-ajax-library/

    【讨论】:

      【解决方案2】:

      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 相同)

      【讨论】:

      • 这里关于从服务器获取所有事件而不是每天的第一条评论是有道理的,我把它修复成这样:(在绘制 day-divs 的循环之后......)@987654326 @也感谢 divday+datestring,但由于这个日历一次只显示一个月,这不是一个大问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      • 2017-12-23
      相关资源
      最近更新 更多