在一段时间后杀死Javascript进程

时间:2010-02-19 00:43:04

标签: javascript timeout

如果这是重复,我道歉。

假设我有一个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(),这些似乎只是延迟了脚本的执行,而我希望从字面上“超时”一个长时间运行的进程。有什么想法吗?

此外,我对我的代码的批评/改进持开放态度,这将允许此功能。

2 个答案:

答案 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
相关问题