2 - 4 都发生在服务器端。没有什么可以阻止您轮询结果的预期结果位置(在服务器端),然后在结果最终出现时返回结果。
- 客户端发送请求
- 服务器启动作业并开始轮询结果
- 结果返回,因此服务器端的轮询循环结束
- 服务器将结果发送回客户端
- 客户端-服务器连接终于被切断了
如果作业可以在完成时执行一个 url,那么您可以获得更高效的代码。在这种情况下,您的服务将有两个端点……一个供客户端启动进程,另一个供您的作业队列调用。
- 客户端发送请求
服务器开始工作......将响应回调保存在一个全局对象中,这样它就不会关闭(我假设这里是 express 的东西)
openJobs.push({ id: 12345, res: res }); jobQueue.execute({ id: 12345, data: {...}});
作业完成并保存结果后,使用 id 调用服务 url
- 您可以检查作业是否已实际完成并从 openJobs 列表中删除该作业
完成原始响应
openJob.res.send(数据);
这将发送数据并关闭原始的客户端-服务器连接。
总体结果是您根本没有投票……这很酷。
当然......在这两种情况下,如果您的服务器在批处理过程中关闭,您就会被搞砸......这就是为什么我会在这种情况下推荐像 socket.io 这样的东西。您可以在某处将作业的结果排队,socket.io 将轮询/等待列表上的回调,并在有新项目时推送到客户端。这更好,因为如果服务器崩溃没什么大不了的 - 一旦服务器恢复,客户端将重新连接。