【问题标题】:Kill a Javascript process after a set amount of time在设定的时间后终止 Javascript 进程
【发布时间】:2011-01-18 14:22:19
【问题描述】:

如果这是重复的,我深表歉意。

假设我有一个 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(),它们似乎只是延迟了脚本的执行,而我想真正地“超时”一个长时间运行的进程。有什么想法吗?

此外,我愿意接受任何批评/改进我的代码以实现此功能。

【问题讨论】:

    标签: javascript timeout


    【解决方案1】:

    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
    

    【讨论】:

    • 我正在使用 jQuery。所以基本上我必须用 $.ajax(timeout: 50000, WebService.invoke(...);) 来包装我的 WebService.invoke 调用,类似吗?
    • @KG:您可以使用$.ajaxSetup() 设置超时属性,该属性将全局应用于使用$.ajax() 进行的所有调用。请参阅我的更新答案。
    【解决方案2】:

    我会这样做的方式是这样的(非常粗略的伪代码):

    InvokeWebService
    setTimeout
    
    onTimeout:
        cancelInvokation
        DoOtherStuff
    
    onWebServiceCompletion:
        cancelOnTimeout
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-23
      • 2017-03-27
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多