我有一些作为后台作业运行的进程,允许用户继续使用页面,当作业完成时(可能需要几分钟)我想向用户显示消息,最好的地方显示这将是主页AFAIK(如果他们在网站上从一个页面移动到另一个页面),所以我在主页文件中定义了一个div。
我正在尝试找到显示数据的最佳方法,目前我在masterpage vb文件中有一个方法,该方法轮询数据库以查看作业(涉及复杂逻辑和某些数据库访问)是否已完成,如果有,它会在div中显示一条消息,例如“工作13132已经完成” - 工作正常。
问题是这不是动态的,我必须刷新页面来调用检查进程是否已经完成的函数,我如何使用AJAX每5秒自动传送一次这个内容?
我尝试使用具有5秒滴答时间的asp计时器,但整个页面每5秒钟会在计时器点击事件中刷新。
Protected Sub Timer1_Tick(Byval sender as Object, Byval e As EventArgs)
poll_results()
End Sub
Public Sub poll_results()
'database access logic
If dbtable.isCompleted = True
Dim sb As New StringBuilder()
sb.Append("$('#status').html('Job abc123 is complete');")
Page.ClientScript.RegisterStartupScript(GetType(Page), "myscript", sb.ToString(), True)
End If
End Sub
有没有办法只使用更新的消息刷新div,而不使用此代码进行完全刷新?或者,如果这是不可能的,有没有办法使用jQuery复制上述函数,并且只有在作业完成后才能更新DIV文本?
答案 0 :(得分:0)
最常见的方法是创建一个将呈现JSON或HTML的单个页面。这个作为“poll_results”方法,将其视为poll_result.aspx。您可以将单个作业ID传递给此页面,也可以仅对上次轮询后已完成的任何作业进行轮询。
您的主页将有一个JavaScript的snipet将使用计时器(客户端javascript计时器)向服务器发送AJAX请求,点击您的“poll_request.aspx”页面。此页面将返回HTML或JSON,您将编写一些JavaScript来显示您的消息。如果您需要一些代码示例,请告诉我。
答案 1 :(得分:0)
您可以轻松地抛出我们所谓的异步调用,而不是在同一页面中调用您的方法,只需在您的网站中创建一个async
文件夹并添加一个新的通用处理程序,调用页面,例如checkPendingJobs.ashx
。
在该页面中,添加您当前的方法:
Public Sub ProcessRequest (Byval context as HttpContext)
Dim r As String = ""
If dbtable.isCompleted = True
Dim sb As New StringBuilder()
r = "Job abc123 is complete"
End If
context.Response.ContentType = "text/plain"
context.Response.Write(r)
}
现在您已经完成了服务器部分,让我们在您的页面中执行客户端部分,将此 jQuery 代码添加到巡视母版页中,每次都会触发一个刷新页面,或者您可以使用setInterval()
每隔xx秒检查一次:
<script>
var checkJobs = true;
$(document).ready(function() {
// every time someone refreshes the page
checkPendingJobs();
// every 5 seconds...
setInterval(function(){ checkPendingJobs(); }, 5000);
});
function checkPendingJobs() {
// no need to check it if we already have a valid response
if(!checkJobs) return;
// caching issue trick
var now = new Date();
$.ajax({
url: "../async/checkPendingJobs.ashx",
type: "GET",
data: { t: now.getTime() },
success: function(data) {
// do we have text to show?
if(data.length > 0) {
alert(data);
checkJobs = false; // no need to check it more...
// $('#status').html(data);
}
},
error: function(msg) {
alert('Error found:\n' + msg);
}
});
}
</script>