如果这是重复,我道歉。
假设我有一个JavaScript函数调用Web服务来提取一些数据。我使用某种移动图形让用户知道它正在工作。成功检索后,我将图形更改为复选标记。这是我的代码:
getData: function() {
$("#button").attr("disabled", "true");
var params = {
doRefresh: false,
method: '/GetData',
onSuccess: new this.getDataCallback(this).callback,
onFailure: new this.getDataFailed(this).callback,
args: { text: $("#getData").val() }
};
WebService.invoke(params.method, params.onSuccess, params.onFailure, params.args);
}
我想要的是5分钟后,如果这个过程仍然没有成功返回我的数据,抛出异常,或者更好的是,运行我的函数this.getDataFailed(this).callback。这似乎对JavaScript有用吗?我查看了setTimeout()和setInterval(),这些似乎只是延迟了脚本的执行,而我希望从字面上“超时”一个长时间运行的进程。有什么想法吗?
此外,我对我的代码的批评/改进持开放态度,这将允许此功能。
答案 0 :(得分:5)
IE8提供timeout
属性和ontimeout
事件。但这些都是非标准的。
我注意到你在一些示例代码中使用了jQuery。 jQuery还为其ajax()
方法支持timeout
属性,该方法将在达到超时限制后执行error
回调。在进行任何ajax调用之前,您可以使用$.ajaxSetup()
方法声明超时:
$.ajaxSetup({
timeout: 300000
});
如果你没有使用jQuery来发出请求,你可以推出自己的超时代码:
var xhrTimeout;
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://blah.com/etc", true);
xhr.onreadystatechange = function ()
{
if (xhr.readyState == 4)
window.clearTimeout(xhrTimeout);
}
xhr.send();
xhrTimeout = window.setTimeout(function ()
{
xhr.abort();
failFunction();
}, 300000); // 5 mins
答案 1 :(得分:3)
我会这样做的方式(非常粗糙的伪代码):
InvokeWebService
setTimeout
onTimeout:
cancelInvokation
DoOtherStuff
onWebServiceCompletion:
cancelOnTimeout