接口轮询调用问题

文章讨论了在前端开发中应谨慎使用setInterval的原因,因为它可能导致不准确的定时执行。推荐使用setTimeout配合异步逻辑(如Promise)来实现更精确的周期性任务,并提醒注意arguments.callee已过时且对性能有影响,建议传递函数引用以优化性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前端周期性逻辑脚本,应谨慎使用setInterval 它会以时间轴(但是又卡不准)固定周期性地执行脚本,比如调用接口更新页面。

假设5秒周期,但是你的接口突然抽风,3秒才返回,那么再过2秒,下一个周期又到了,这与一般意义上间隔5秒刷新的诉求是违背的。

如果接口情况更糟糕,超过了5秒,那么上一次还没执行完,下一次又开始了,这在绝大多数的业务场景下是不合适的,甚至是错误的!

使用如下方式优化

(function(){

try{

//TODO: something

}finally{

setTimeout(arguments.callee,5000);

}

})

以这种形式来实现周期性逻辑,会正确地实现“间隔“的周期,并且,在异步逻辑,比如接口调用是。应该在Promise链的最后一步,发起setTimeout重新安排下一次的周期

另外,arguments.callee已经过时被弃用了,访问arguments 是个很昂贵的操作,因为它是个很大的对象,每次递归调用时都需要重新创建,会很大程度下影响浏览器的性能,这样使用的问题更大。

所以,应该这样改进

(function fn(){

try {

// TODO: something

} finally {

setTimeout(fn, 5000);

}

})

### Java 中实现异步轮询调用接口 在Java中,为了不阻塞主线程并处理耗时较长的任务,可以采用异步轮询的方式获取操作结果。这通常涉及到创建一个异步任务,在后台持续检查某个条件直到满足为止。 #### 使用 `CompletableFuture` 进行异步轮询 下面是一个基于 `CompletableFuture` 的例子来展示如何构建这样的机制: ```java import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; public class AsyncPollingExample { private static final int MAX_RETRIES = 10; // 最大重试次数 private static final long POLLING_INTERVAL_MS = 2000L; // 轮询间隔时间(毫秒) public static void main(String[] args) { CompletableFuture<Void> future = pollForCompletion(MAX_RETRIES, POLLING_INTERVAL_MS); future.thenRun(() -> System.out.println("Operation completed or max retries reached.")); } /** * 异步轮询方法。 * * @param maxRetries 最大尝试次数 * @param pollingIntervalMs 每次轮询之间的等待时间(毫秒) */ private static CompletableFuture<Void> pollForCompletion(int maxRetries, long pollingIntervalMs) { return CompletableFuture.runAsync(() -> { boolean operationCompleted = false; int attemptCount = 0; while (!operationCompleted && attemptCount < maxRetries) { try { Thread.sleep(pollingIntervalMs); // 等待一段时间再进行下一次查询 // 假设这里有一个外部服务调用来判断操作是否完成 operationCompleted = checkIfOperationIsComplete(); ++attemptCount; System.out.printf("Attempt %d: Operation is%s complete.\n", attemptCount, (operationCompleted ? "" : " NOT")); } catch (InterruptedException e) { Thread.currentThread().interrupt(); // 如果线程被中断,则恢复其状态 throw new RuntimeException(e.getMessage(), e); } } if (!operationCompleted) { System.err.println("Max attempts exceeded without completion."); } }); } /*** * 模拟对外部服务的状态检查。 */ private static boolean checkIfOperationIsComplete() { // 此处应替换为真实的业务逻辑代码, // 返回 true 表示已完成;false 则表示未完成。 return Math.random() > 0.8; // 随机决定是否已经完成作为示范用途 } } ``` 此程序展示了如何设置最大重试次数以及两次连续请求间的延迟,并通过循环不断询问某项工作是否结束直至达到设定的最大迭代数或是成功检测到作业完毕[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值