function getNames(){
// some code
}
这个函数可以在一秒钟内完成,但有时会在无限时间内冻结页面上的html块(内部的ajax)。
我希望这个功能有时间限制。如果它在十秒内没有完成,则中止它。
怎么做?
答案 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)
如果功能本身正在消失,只需设置一个计时器return
或throw
,如果超过最长时间段。
另一方面,如果延迟是由AJAX请求未返回引起的,并且您使用$.ajax()
,则始终可以设置timeout
设置。它应该杀死请求。请注意,您需要避免依赖success
回调,因为只有在请求成功时才会调用它。相反,使用complete
回调来监视失败。它会告诉您是否发生了错误。根据文档,这在1.4以后可用。我不确定1.4之前的版本,但我认为它也适用于1.3版本。
答案 2 :(得分:0)
如上所述,如果某些代码有时可能需要很长时间(例如等待来自慢速服务器的大量信息),您可以使用Web Workers。这将允许后台处理而不锁定主页面。请注意,并非所有浏览器都支持它。
你可以找到一个很好的介绍here。