使用 Java Spring Boot 和 JavaScript 实现异步进度条

在现代Web开发中,异步请求能让我们的应用更加高效和用户友好。本文将介绍如何在 Java Spring Boot 后端与 JavaScript 前端之间实现一个异步进度条。整个流程主要分为以下几个步骤:

步骤 描述
1 设置 Spring Boot 项目环境
2 创建异步处理的 REST API
3 前端使用 JavaScript 发起请求
4 更新前端进度条

下面我们详细探讨每个步骤,并提供相应的代码示例。

步骤 1:设置 Spring Boot 项目环境

首先,你需要创建一个 Spring Boot 项目。可以使用 Spring Initializr 生成项目结构,并添加 Spring Web 依赖。

// 在 application.properties 中设置服务器端口
server.port=8080

application.properties 文件是 Spring Boot 的配置文件,用于设置应用程序的属性。

步骤 2:创建异步处理的 REST API

在这个步骤中,你需要创建一个异步的方法来处理长时间的任务。以下是一个简单的 REST 控制器,模拟长时间运行的进程。

import org.springframework.web.bind.annotation.*;
import java.util.concurrent.CompletableFuture;

@RestController
@RequestMapping("/api")
public class ProgressController {

    @GetMapping("/process")
    public CompletableFuture<String> longRunningProcess() {
        return CompletableFuture.supplyAsync(() -> {
            try {
                // 模拟长时间任务
                for (int i = 0; i < 10; i++) {
                    Thread.sleep(1000); // 假设每次处理需要 1 秒
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "Process Completed!";
        });
    }
}

supplyAsync 方法异步执行任务,返回一个 CompletableFuture 对象。

步骤 3:前端使用 JavaScript 发起请求

前端使用 JavaScript 的 fetch API 来发起异步请求,并更新进度条。以下是一个简单的 HTML 和 JavaScript 示例。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Async Progress Bar</title>
    <style>
        #progressBar {
            width: 100%;
            background-color: #f3f3f3;
        }
        #progress {
            width: 0%;
            height: 30px;
            background-color: #4caf50;
        }
    </style>
</head>
<body>
    异步进度条示例
    <div id="progressBar"><div id="progress"></div></div>
    <button id="startBtn">开始处理</button>
    
    <script>
        document.getElementById('startBtn').onclick = function() {
            let progressBar = document.getElementById('progress');
            progressBar.style.width = '0%';
            let interval = setInterval(() => {
                let currentWidth = parseFloat(progressBar.style.width);
                if (currentWidth >= 100) {
                    clearInterval(interval);
                } else {
                    progressBar.style.width = currentWidth + 10 + '%'; // 每次增加10%
                }
            }, 1000); // 每秒更新进度

            fetch('/api/process')
                .then(response => response.text())
                .then(data => {
                    clearInterval(interval);
                    alert(data); // 处理完成时弹出消息
                });
        };
    </script>
</body>
</html>

上述代码中,setInterval 用于模拟进度条更新,而 fetch 则是用来向后端发起请求。

步骤 4:更新前端进度条

在 JavaScript 中,当处理过程完成时,会清楚定时器并弹出提示消息。进度条的宽度在按钮点击时通过 setInterval 来不断增加。

clearInterval(interval);

当处理完成后,清除进度条的更新。

序列图

以下是整个过程的序列图:

sequenceDiagram
    participant User
    participant Frontend
    participant Backend

    User->>Frontend: 点击开始处理按钮
    Frontend->>Backend: 发起异步请求
    Backend-->>Frontend: 处理完成
    Frontend->>User: 弹出完成提示

总结

通过上述步骤,我们使用 Java Spring Boot 构建了一个异步处理的 API,并在前端使用 JavaScript 实现了一个进度条。在此过程中,你学会了如何利用异步编程模型来处理长时间运行的任务,同时提升了用户体验。希望这篇文章能够帮助你更好地理解和实现异步进度条的功能!