如何使用Jquery / Javascript轮询到WebMethod

时间:2014-06-17 20:57:12

标签: c# jquery asp.net webmethod ajax-polling

有人能告诉我如何使用Javascript / JQuery在特定时间间隔内对webMethod进行投票吗?我试过setInterval& setTimeOut但不是他们正在为我工​​作。我的应用程序生成有关用户请求的报告。由于报告生成需要10-15分钟,我不想阻止UI线程,所以我创建一个关于按钮点击javascript并使用_dopostback调用按钮点击事件的reportID并将reportID传递给它。使用Delegate / BeginInvoke C#按钮单击事件调用generate_report()函数,现在我想轮询到我创建的WebMethod以获取报告...这里是一段代码片段。

 $("#btn1").click(function () {
     var ReportID = generateReportID();
     __doPostBack("<%= btnGenerate.UniqueID %>", ReportID);
     IntervalID = setInterval(function () { Poll(ReportID); }, 30000);
 });

 function Poll(id) {
     $.ajax({
         type: "POST",
         url: "Default.aspx/WebMethod",
         data: "{'ReportID','" + id + "'}",
         contentType: "application/json; charset=utf-8",
         dataType: "json",
         success: function (response) {
                    // Check if report is ready 
                    // If not poll again after 30 secs
                    // If report is ready Get the Report and clearInterval
         },
         failure: function (error) {
         }
     });
 };

 [WebMethod]
 public static string WebMethod(string ReportID)
 {
     if (ResultSet.ContainsKey(int.Parse(ReportID)))
     {
         return "Ready";
     }
     else
     {
         return "NotReady";
     }
  }

所以在按钮上单击如何在每30秒后开始对此Web方法进行轮询,直到报告为&#34; Ready&#34;并在准备好之后清除间隔。 ??

2 个答案:

答案 0 :(得分:2)

SetInterval工作正常,PostBack是罪魁祸首....后续回发即按钮点击会杀死之前的setintervals ....所以现在我将所有ReportID传递给按钮点击功能和使用客户端脚本的setIntevals代码隐藏

Page.ClientScript.RegisterStartupScript(typeof(Page),“test”+ UniqueID,“setInterval(function(){Poll(ReportID);},30000);”,true);

替代方法是将ReportID发送到函数后面的代码并使用客户端脚本循环并设置间隔foreach ReportID,还可以在localStorage中保存ReportID,以便在后续回发中使用它。

注意:感谢您的帮助@Krzysztof Safjanowski

答案 1 :(得分:0)

使用SetTimeout以递归方式调用自身,直到获得所需的结果。

例如:

function initPoll()
{
    setTimeout(pollWebServer(), 30000);
}    
function pollWebServer()
{
     if(!checkResult())
         setTimeout(pollWebServer(), 30000);
}    
function checkResult()
{
    //Do some work to check result that you are looking for
    //This is where you would check your Web Method using jQuery
    return false;
}