轮询函数
  aJvBqpCFzEBz 2023年11月02日 62 0
js


const ServerMock = {
count: 0,
getData() {
if (this.count === 2) {
return Promise.resolve([{ name: "SomeName" }]);
} else {
this.count++;
return Promise.reject("Error");
}
}
};

function fetchData(limit, time) {
return {
then(resolve, reject) {
const retry = setInterval(async () => {
limit--;
try {
console.log("Trying....");
const data = await ServerMock.getData();
if (data) {
console.log("Resolve");
clearInterval(retry);
resolve(data);
}
} catch {
if (limit === 0) {
clearInterval(retry);
reject("Limit Reached");
}
}
}, time);
}
};
}
// 轮询的时间为100,轮询的最大次数为3
(async () => {
try {
const result = await fetchData(3, 1000);
console.log(result);
} catch (err) {
console.log(err);
}
})();

上面是间隔一段时间轮询,我们还可以不设置间隔时间而是不断轮询

const ServerMock = {
count: 0,
getData() {
console.log('调用')
if (this.count === 2) {
return Promise.resolve([{ name: "SomeName" }]);
} else {
this.count++;
return Promise.reject("Error");
}
}
};
const retry = (attempts, action) => {
console.log('todo')
const promise = action()
return attempts > 0 ? promise.catch(() => retry(attempts - 1, action)) : promise
}

(async () => {
let res = await retry(5, () => ServerMock.getData())
console.log(res)
})


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

aJvBqpCFzEBz