ajax 轮询如何设置次数和超时?

2017-08-15 11:56:16 +08:00
 guyeuro

譬如轮询 5 次后就不轮询了

或者第一次轮询开始,

超过 1 分钟后,就终止轮询

3745 次点击
所在节点    问与答
9 条回复
a570295535
2017-08-15 12:14:03 +08:00
function f(){
//这里放上你的代码
};
for(var i = 1; i < 5; i++){//只能刷新 5 次
setTimeout(f, 2000);//2 秒刷新一次
}
我也不知道行不行,你试试
a570295535
2017-08-15 12:16:44 +08:00
var timesRun = 0;
var interval = setInterval(function(){
timesRun += 1;//每刷新一次 timesRun 就+1
if(timesRun === 60){//如果它等于 60 次了,就删除这个 setInterval 循环
clearInterval(interval);
}
//这里写你的代码
}, 2000);
a570295535
2017-08-15 12:20:00 +08:00
上面是根据次数,这次试试时间的:
var startTime = new Date().getTime();//现在的时间
var interval = setInterval(function(){
if(new Date().getTime() - startTime > 60000){//现在的时间减去刷新开始的时间大于 60 秒
clearInterval(interval);//就删除这个 setInterval 轮询
return;
}
//这里写你的代码
}, 2000);
a570295535
2017-08-15 12:38:13 +08:00
测试成功,例子 1,限制次数:
<script type="text/javascript" src="http://upcdn.b0.upaiyun.com/libs/jquery/jquery-1.8.3.min.js"></script>
<script type="text/javascript">
var timesRun = 0;//默认 timesRun 等于 0 次
var interval = setInterval(function(){
timesRun += 1;//每轮询一次 timesRun 就+1
if(timesRun === 5){//轮询 5 次
clearInterval(interval);//清除轮询
}
//我的代码
function genHitokoto(){
$.ajax({
url: "https://sslapi.hitokoto.cn/?c=f&encode=text",//轮询地址
type: 'GET',timeout: '3000',//3 秒超时
success: function(data) {
document.getElementById("hitokoto").innerHTML = data;//把一句话输出到 div
},
async: true,//异步请求
});};genHitokoto();
}//我的代码结束
, 2000);//2 秒轮询一次
</script>
<div id="hitokoto"></div>
a570295535
2017-08-15 12:43:52 +08:00
上面的 [}//我的代码结束] 写错行了,应该写到这个 [}] 的上面,
测试成功,下面的代码是运行 60 秒的例子,全都很好用:
<script type="text/javascript" src="http://upcdn.b0.upaiyun.com/libs/jquery/jquery-1.8.3.min.js"></script>
<script type="text/javascript">
var startTime = new Date().getTime();//现在的时间
var interval = setInterval(function(){
if(new Date().getTime() - startTime > 60000){//现在的时间减去刷新开始的时间大于 60 秒
clearInterval(interval);//就删除这个 setInterval 轮询
return;
}
//我的代码
function genHitokoto(){
$.ajax({
url: "https://sslapi.hitokoto.cn/?c=f&encode=text",//轮询地址
type: 'GET',timeout: '3000',//3 秒超时
success: function(data) {
document.getElementById("hitokoto").innerHTML = data;//把一句话输出到 div
},
async: true,//异步请求
});};genHitokoto();
//我的代码结束
}, 2000);
</script>
<div id="hitokoto"></div>
guyeuro
2017-08-16 16:13:55 +08:00
guyeuro
2017-08-16 16:14:58 +08:00
@a570295535

var timesRun = 0;
var interval = setInterval(function(){
timesRun += 1;//每刷新一次 timesRun 就+1
if(timesRun === 60){//如果它等于 60 次了,就删除这个 setInterval 循环
clearInterval(interval);
}
//这里写你的代码
}, 2000);
---------------------------------------------

你这里这个 interval 变量能被函数里面的 clearInterval(interval) 调用??
a570295535
2017-08-16 16:16:27 +08:00
@guyeuro 可以啊,你没看下面我的例子吗,都成功执行了啊
yangtze
2018-12-14 16:59:43 +08:00
结合 Promise:

```
let count = 5;
const f = () => {
return new Promise((resolve, reject) => {
count--;
resolve({ success: count > 0 ? false : true });
});
};

const poll = fn => {
const startTime = new Date().getTime() + 5000;
let count = 100;
let interval = setInterval(() => {
if (new Date().getTime() > startTime || count === 0) {
clearInterval(interval);
return;
}
fn()
.then(data => {
if (data.success === true) {
console.log("处理完成");
clearInterval(interval);
} else if (data.success === false) {
console.log("还在处理中");
}
})
.catch(err => {
console.log(err);
})
.finally(() => {
count--;
});
}, 300);
};

poll(f);
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/383039

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX