2

谁能告诉我如何使用 Javascript/JQuery 在特定时间间隔内轮询 webMethod ?我尝试了 setInterval 和 setTimeOut 但没有一个对我有用。我的应用程序根据用户的请求生成报告。因为报告生成需要 10-15 分钟,所以我不想阻止 UI 线程,所以我在 javascript 的按钮点击时创建了一个 reportID,并使用 _dopostback 调用按钮点击事件并将报告 ID 传递给它。C# 按钮单击事件使用 Delegate/BeginInvoke 调用 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 方法,直到报告“就绪”并在就绪后清除间隔。??

4

2 回答 2

2

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

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

替代将 ReportIDs 发送到函数背后的代码并使用客户端脚本循环并设置每个 ReportIDs 的间隔,还可以将 ReportIDs 保存在 localStorage 中,以便在后续回发中可用。

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

于 2014-07-07T07:13:02.990 回答
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;
}
于 2014-06-17T21:09:07.607 回答