js实现简单轮询

业务场景:

前端上传图片文件, 后台异步调用第三方上传文件接口返回文件id, 并存入redis中, 前端上传成功后轮询去调用接口查看文件id是否存入缓存中, 获取到则赋值,获取不到继续轮询,超过一定轮询时间后报错结束轮询

 以上截图展示文件上传成后开始轮询调用查询文件id接口,效果实现。

代码实现(主要展示前端代码):

1.我是上传图片的业务所以先展示上传组件代码

 提供代码CV

<div class="avatar-uploader-box">
                <el-upload class="avatar-uploader" action="/mall/file/uploadGetFileId?dir=mall/shopInfo/"
                  :before-upload="beforeAvatarUpload"
                  :show-file-list="false"
                  :accept="accept"
                  :headers="{ 'Authorization': headers.Authorization }"
                  :on-success="handleReceiverCertSuccess"
                  v-loading.fullscreen.lock="tableLoading"
                  element-loading-text="拼命上传中,请等待..."
                  element-loading-spinner="el-icon-loading"
                  element-loading-background="rgba(0,0,0,0.8)">
                  <img v-if="subjectInfo.receiverCert" :src="subjectInfo.receiverCert" class="avatar">
                  <span v-else class="el-icon-plus avatar-uploader-icon"></span>
                </el-upload>
              </div>

2.展示文件上传成功后钩子函数里的代码

 

js代码逻辑解释(建议看图片就行, 下面文字用来增加文本索引用的):

2.1因为我的上传图片组件可以支持修改, 所以为了避免影响后面的赋值判断所有只要是上传就先清空.

2.2定义一个轮询终结时间, 如果15秒后未获取到结果则结束轮询

2.3定义轮询任务, 固定写发setInterval()函数传入两个参数, 一个是需要轮询执行的代码逻辑, 另外一个是间隔时间,我这里是2秒执行一次, 返回值是这个timeId是这个任务Id,业务逻辑是查看文件Id是否返回, 已经返回直接该任务, 没有的话继续调用后台接口获取, 调用之前之前判断是否超过设定时间, 超过后则通过this.$set方法将原来上传成功的文件路径去除, 表示改文件上传失败, 需要重新上传

2.4通过clearInterval(timeId)将这个轮询任务结束

2.5调用获取文件

Java实现轮询(Long Polling)通常是为了实现实时通信或推送服务,它是一种HTTP请求优化技术。在长轮询中,客户端向服务器发送一个HTTP GET请求,并保持连接打开,直到有新数据可用或超时才会关闭。如果服务器在此期间有新的消息,就立即响应;如果没有,则服务器不会发送任何内容,直到时间过期后自动断开并关闭连接。 以下是简单的Java实现轮询的步骤: 1. 客户端(浏览器或Web应用): - 使用JavaScript定时函数发起定期的GET请求到服务器。 - 如果服务器返回了数据,客户端处理数据并更新界面;否则等待一段时间(如5秒)后再尝试请求。 2. 服务器端(Java应用程序): - 当有新数据时,检查是否有未完成的长时间等待请求。如果有,直接回应数据;如果没有,让请求等待指定的时间(例如最大轮询间隔)。 - 使用`HttpServletResponse#setKeepAlive(true)`来支持长连接。 - 使用`ServletOutputStream#write()`或`BufferedOutputStream#write()`将数据发送回客户端。 ```java // Server-side (using Java Servlets) @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { if (!request.isAsyncSupported()) { // If async not supported, return immediately response.sendError(HttpServletResponse.SC_BAD_REQUEST); return; } // Check for new data boolean hasData = checkForNewData(); // Start an asynchronous response if needed AsyncContext ctx = request.startAsync(); ctx.setTimeout(60000); // Set timeout to a reasonable value try { if (hasData) { // If data is available, send it immediately sendData(response.getOutputStream()); } else { // No data yet, wait and poll again ctx.getAsyncExecutor().execute(() -> { Thread.sleep(5000); // Sleep for a while request.getRequestDispatcher("/").forward(request, response); }); } } catch (Exception e) { ctx.complete(e); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值