您应该重新设计您的方法以使用长轮询机制,使用WebSosket或JSON 流也将是一个选项。
一点解释:
您有一项耗时的任务(需要 2 分钟,如果您的应用程序有更多负载,可以肯定它可能需要更多时间)。因此,如果您将使用简单的 Request-Respons 方法,则会因为超时问题而出错。
因此,使用建议的方法将更适合您的情况。
让我们看一下 WebSocket 示例:
在你的 go 代码中,你会有类似的东西(这只是一个例子,我不知道 chi 和 usegithub.com/gorilla/websocket
和 vanilla net/http
,但我很确定你可以用 chi 做同样的事情):
package main
import (
"fmt"
"github.com/gorilla/websocket"
"log"
"net/http"
"time"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
func main() {
http.HandleFunc("/ws", wsHandler)
panic(http.ListenAndServe(":8080", nil))
}
func wsHandler(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
if err != nil {
http.Error(w, "Could not open websocket connection", http.StatusBadRequest)
}
go echo(conn)
}
func echo(conn *websocket.Conn) {
defer conn.Close()
m := ""
err := conn.ReadJSON(&m)
if err != nil {
fmt.Println("Error reading json", err)
}
// receive some data from your reactjs
fmt.Printf("Got message: %#v\n", m)
om := struct {
mes string
}{
mes: "Send to client",
}
// send some data
if err = conn.WriteJSON(om); err != nil {
fmt.Println(err)
}
// do some work in 2 min
time.Sleep(120 * time.Second)
// send some data
if err = conn.WriteJSON(om); err != nil {
fmt.Println(err)
}
}
在您的 react js 应用程序中,您将拥有如下内容:
import React, { useState } from "react";
function App() {
let isDone = false;
const messages = []
const ws = new WebSocket("wss://localhost:8080/ws");
const apiCall = {
mes: "Your json for server"
};
ws.onopen = (event) => {
ws.send(JSON.stringify(apiCall));
};
ws.onmessage = function (event) {
const json = JSON.parse(event.data);
messages.push(json)
} catch (err) {
console.log(err);
}
};
ws.onclose = function (event) {
isDone = true
};
const mess = messages.map((item) => {
return (
<div>
<p> {item}</p>
</div>
);
});
return (
<div>
<div>{mess}</div>
<div> is work done?: {isDone}</div>
</div>
);
}
export default App;
在此示例中,我们向服务器发送一些信息并开始等待工作何时完成(关闭isDone = true
时ws
),同时接收一些消息(在您的情况下可能不需要)。
使用长轮询和 JSON 流来实现这个想法也是如此(我认为你很容易在互联网上找到一些东西:))