我如何处理真正密集的服务器端任务,这可能需要几分钟?这是一个面向用户的任务,所以用户可以给我一些数据,然后服务器将在后端工作。我是个新手,但我想如果我用的是async/await,我的浏览器不会"等待"这么久,但如果我不使用async wait,我就不知道任务是否成功完成了。还是我漏掉了什么
async/await
egdjgwm81#
任务越大,依赖于单个HTTP请求/响应的解决方案就越脆弱。想象一下,任务完成99%后连接断开,客户端将不得不重复整个过程。相反,我建议使用如下依赖于几个HTTP请求的模式:
POST /starttask
GET /task/<taskID>
GET /taskresult/<taskID>
GET /taskresult/<taskID>?page=1
POST /taskcleanup/<taskID>
ki1q1bka2#
使用await / async可以工作,因为它将永远等待,直到一个承诺(请求到后端)已经履行。你可以向用户显示某种加载图形,这是其他网站如何处理冗长的任务。取决于任务的大小,但举例来说,如果任务相当小(例如10秒),我们可以使用"正在加载“状态作为识别是否应显示加载图形的方式:
function example() { setLoading(true); try { const response = await axios.get('/user?ID=12345'); console.log(response); } catch (error) { console.error(error); } finally { setLoading(false); } }
Axios Minimal Example
vkc1a9a23#
我认为保持连接打开等待响应几分钟是不好的。相反,我建议SignalR服务器端通知(或等效)通知前端有关任务更新。通知DTO将包含有关任务的所有所需信息。后端:
// Post method void startTask(params) { // start backend processing // after completion notify signalRHub.notify(); }
在前端,您只需要订阅通知并为它们添加处理程序。
3条答案
按热度按时间egdjgwm81#
任务越大,依赖于单个HTTP请求/响应的解决方案就越脆弱。想象一下,任务完成99%后连接断开,客户端将不得不重复整个过程。
相反,我建议使用如下依赖于几个HTTP请求的模式:
POST /starttask
的请求以启动任务,并在响应中接收“任务ID”。GET /task/<taskID>
之类的常规请求来检查任务进度,并接收进度通知(完成50%),这可以用于在UI上动画显示“进度条”。GET /taskresult/<taskID>
的请求检索该结果。GET /taskresult/<taskID>?page=1
等),直到接收并处理完整个结果,这不会给服务器带来太大负担,因为它只是从数据库读取任务结果。POST /taskcleanup/<taskID>
)从服务器数据库中删除任务结果。ki1q1bka2#
使用await / async可以工作,因为它将永远等待,直到一个承诺(请求到后端)已经履行。你可以向用户显示某种加载图形,这是其他网站如何处理冗长的任务。
取决于任务的大小,但举例来说,如果任务相当小(例如10秒),我们可以使用"正在加载“状态作为识别是否应显示加载图形的方式:
Axios Minimal Example
vkc1a9a23#
我认为保持连接打开等待响应几分钟是不好的。
相反,我建议SignalR服务器端通知(或等效)通知前端有关任务更新。
通知DTO将包含有关任务的所有所需信息。
后端:
在前端,您只需要订阅通知并为它们添加处理程序。