您应该考虑使用server-sent events。这里有一些地方可以了解更多信息:
服务器发送的事件是natively supported in Chrome, Opera, Firefox, and Safari,还有polyfills you can use to make server-sent events work in Edge/IE,甚至还有jQuery plugin。
这是一些客户端代码的一个非常简单的示例:
var source = new EventSource("/server-side-app-that-gives-progress-updates")
source.onmessage = function(e) {
console.log(e.data);
}
在服务器端,您的 /server-side-app-that-gives-progress-updates 应用程序只会发回格式如下的纯文本数据:
data: some data\n
data: more data\n\n
它通过发送带有Content-Type: text/event-stream 标头的响应来开始流式传输。上面的客户端代码会将其视为带有“some data\more data”的单个 e.data 消息。
当服务器应用有更新时,它只是将另一条该形式的消息写入响应。
如果您想以一系列 JSON 消息的形式发送更新,您的服务器应用会写道:
data: {"foo": "bar", "hoge": "moge"}\n\n
然后您的客户端代码可以这样做:
source.onmessage = function(e) {
var jsonObject = JSON.parse(e.data);
console.log(jsonObject.foo);
}
当然,您可以在上面提到的地方了解更多内容。但简而言之就是这样。
我有一个 http 服务器,它根据客户端的请求运行某个任务
在返回之前可能需要一些时间的背景
结果给客户。
这是服务器发送事件设计的关键用例之一。
有没有办法用进度信息更新客户端
具体的后台任务?
是的,您可以使用服务器发送的事件来做到这一点。
有XMLHttpRequest 的进度处理程序,但如果我理解
正确的,它仅用于数据传输进度。
没错。 XHR 在响应之前无法获取服务器上发生的任何事情的进度信息。
在我的应用程序中,流程示例如下:
这是 http 规范的一部分吗?
它不是 HTTP 规范的一部分(尽管 HTTP/2 有一些相关的功能)。
或者我需要别的东西(websocket..?)
你不需要 WebSockets。 WebSocket 非常适合您需要在客户端和服务器之间进行真正的双向全双工通信的情况,例如实时聊天应用程序。
但是问题中描述的用例是一个只需要从服务器到客户端的单向更新更新通信的用例。这正是服务器发送事件的用途。