実現したいこと
ブラウザで使用するアプリケーションを作っています。
その中で、あるGoのメソッドで記述が多く完了まで時間が掛かるメソッドがあります。
発火はReactからのpostです。
進行状況の確認をブラウザで行いたいと思っているのですが、
そもそもそのような事は可能なのでしょうか?
コンソール上でプログレスバーを入れるライブラリは見つけましたが、
httpで行う事は難しいでしょうか?
1度のリクエストで断続的にクライアントにレスポンスを返し続けるのは可能なのでしょうか?
開発環境は、
フロントがReact、
バックエンドがGoです。
色々と初歩的な質問ですいません。
<<追記>>
App.js
1import React from 'react'; 2import axios from 'axios'; 3import imgLogo from './images/logo.png'; 4import './css/style.css' 5 6class App extends React.Component { 7 8 constructor() { 9 10 super(); 11 12 this.state = { 13 14 } 15 } 16 17 interval = async() => { 18 19 console.log("interval start") 20 21 let res = await fetch("/api/progress"); 22 let data = await res.json(); 23 let progress = document.getElementById("progress"); 24 progress.value = data.progress; 25 progress.innerHTML = data.progress + "%"; 26 } 27 28 start = async() => { 29 30 console.log("start start") 31 32 let progress = document.getElementById("progress"); 33 progress.value = 0; 34 progress.innerHTML = "0%"; 35 let id = setInterval(this.interval(), 1000); 36 await fetch("/api/longtask"); 37 clearInterval(id); 38 window.alert("long task completed"); 39 } 40 41 render() { 42 return ( 43 44 <div> 45 <div className="container"> 46 <button id="start" onClick={async () => {await this.start();} }>start</button> 47 <progress id="progress" max="100" value="0">0%</progress> 48 </div> 49 </div> 50 ) 51 } 52} 53 54export default App;
handler.go
1package handler 2 3import ( 4 // "encoding/json" 5 "fmt" 6 "net/http" 7 "sync" 8 "time" 9 10 _ "github.com/jinzhu/gorm/dialects/postgres" 11 _ "github.com/lib/pq" 12 13 "github.com/labstack/echo/v4" 14 "github.com/labstack/echo/v4/middleware" 15) 16 17type Progress struct { 18 sync.RWMutex 19 Progress int `json:"progress"` 20} 21 22func Handler() { 23 24 e := echo.New() 25 e.Use(middleware.CORS()) 26 27 // ルーティング 28 e.GET("/progress", progress) 29 e.GET("/longtask", longtask) 30 31 // local サーバー 32 e.Logger.Fatal(e.Start(":8000")) 33 34 return 35} 36 37func progress(c echo.Context) (err error) { 38 39 progress := &Progress{} 40 41 fmt.Printf("progress start") 42 43 progress.RLock() 44 c.JSON(http.StatusOK, progress) 45 progress.RUnlock() 46 47 return 48} 49 50func longtask(c echo.Context) error { 51 52 progress := &Progress{} 53 54 for i := 0; i <= 10; i++ { 55 progress.Lock() 56 progress.Progress = i * 10 57 progress.Unlock() 58 time.Sleep(time.Second) 59 } 60 61 return nil 62} 63