函数超时(jQuery)

时间:2011-03-09 09:55:25

标签: javascript jquery html function timeout

function getNames(){
    // some code
}

这个函数可以在一秒钟内完成,但有时会在无限时间内冻结页面上的html块(内部的ajax)。

我希望这个功能有时间限制。如果它在十秒内没有完成,则中止它。

怎么做?

3 个答案:

答案 0 :(得分:3)

使用jQuery 1.5的deferred promises非常简单。

以下示例创建一个Deferred并将两个基于计时器的函数设置为解析拒绝随机间隔后的延迟。无论哪一个先发射“胜利”并将其中一个回调。第二个超时无效,因为Deferred已从第一个超时操作完成(处于已解决或已拒绝状态)。

// Create a Deferred and return its Promise
function asyncEvent() {
    var dfd = new jQuery.Deferred();
    setTimeout(function() {
        dfd.resolve('hurray');
    }, Math.floor(Math.random() * 1500));
    setTimeout(function() {
        dfd.reject('sorry');
    }, Math.floor(Math.random() * 1500));
    return dfd.promise();
}

// Attach a done and fail handler for the asyncEvent
$.when( asyncEvent() ).then(
    function(status) {
        alert( status + ', things are going well' );
    },
    function(status) {
        alert( status + ', you fail this time' );
    }
);

您可以轻松修改此示例以满足您的需求:

// Create a Deferred and return its Promise
function asyncEvent() {
    var dfd = new jQuery.Deferred();

    // Your asynchronous code goes here

    // When the asynchronous code is completed, resolve the Deferred:
    dfd.resolve('success');

    setTimeout(function() {
        dfd.reject('sorry');
    }, 10000); // 10 seconds
    return dfd.promise();
}

// Attach a done and fail handler for the asyncEvent
$.when( asyncEvent() ).then(
    function(status) {
        alert( status + ', things are going well' );
    },
    function(status) {
        alert( status + ', you fail this time' );
    }
);

答案 1 :(得分:2)

如果功能本身正在消失,只需设置一个计时器returnthrow,如果超过最长时间段。

另一方面,如果延迟是由AJAX请求未返回引起的,并且您使用$.ajax(),则始终可以设置timeout设置。它应该杀死请求。请注意,您需要避免依赖success回调,因为只有在请求成功时才会调用它。相反,使用complete回调来监视失败。它会告诉您是否发生了错误。根据文档,这在1.4以后可用。我不确定1.4之前的版本,但我认为它也适用于1.3版本。

答案 2 :(得分:0)

如上所述,如果某些代码有时可能需要很长时间(例如等待来自慢速服务器的大量信息),您可以使用Web Workers。这将允许后台处理而不锁定主页面。请注意,并非所有浏览器都支持它。

你可以找到一个很好的介绍here