【问题标题】:How to wait while the server doesn't respond?服务器没有响应时如何等待?
【发布时间】:2020-12-30 19:36:27
【问题描述】:

我正在构建一个包含用户之间交互的网页,但我有点迷茫。

欢迎任何指导。

想象以下场景:

  • 客户端 A 打开一个“公共”网页并按下按钮。
  • 客户端 A 开始等待客户端 B 的响应
  • 客户端 B 进入“管理”网页并按下按钮。
  • 客户端 A 收到客户端 B 按下按钮的信息。

创建页面的总体思路是客户端 A 可以单击“我准备好玩”按钮并开始等待客户端 B 的响应。客户 B 收到通知并按下按钮“我也准备好了”。客户端 A 收到通知客户端 B 也已准备就绪。

我知道这可以通过 AJAX 完成。但我不确定如何“等待”客户端 B 的响应并在响应到达时更新网页。

欢迎任何帮助/提示。

感谢您的支持。

【问题讨论】:

  • This answer contains three options that would work:短轮询、长轮询和网络套接字。
  • WebRTC 是另一种方法
  • 正如 Alexander 提到的,您正在寻找的技术术语是 Polling。 Websockets 可以帮助你。
  • 轮询看起来我需要我正在研究它并寻找示例代码。如果你们中的任何人有可以分享的示例代码,欢迎:)

标签: javascript jquery ajax


【解决方案1】:

异步

您似乎以同步方式思考,但这不是您应该考虑的方式。您正在向服务器发出命令,但您不应该等待响应,因为:

  • 命令可能永远不会到达,例如。由于互联网连接问题
  • 服务器可能已关闭
  • 服务器可能会错误输出您的命令并且永远不会响应
  • 其他玩家可能永远不会收到消息
  • 其他玩家可能永远不会回复消息
  • 服务器可能永远不会收到其他玩家的命令
  • 服务器可能会错误输出其他玩家的命令
  • 服务器可能永远不会向您发送通知
  • 您可能永远不会收到通知

一方面有很多可能的故障点。而且...另一方面,Javascript 是单线程的。因此,如果您等待其他玩家响应,那么您的 UI 将同时冻结(Web Workers 除外,但这是一个更高级的话题,现在,让我们将 Javascript 视为单线程环境)

相反,您应该异步思考。事实上,在 AJAX 的 achronim 中,第一个“A”代表“异步”。这意味着您发出请求并定义收到响应时将执行的操作。这个“你会做什么”被称为回调。您的客户端将同时工作并做出响应,当响应到达时,它会知道该怎么做。

不仅是你的请求,还有对方的回应

好的,既然我们是异步思考的,那么当其他玩家决定加入你的游戏时,我们需要考虑我们的选择:

轮询

您可以通过setTimeout 和 AJAX 请求定期向服务器发出请求,一旦响应通知您游戏被接受,请相应地处理它。见:https://davidwalsh.name/javascript-polling

推送通知

一旦事件发生,服务器可能会向用户发送通知。见:https://onesignal.com/lp-web-push?utm_source=google&utm_medium=cpc&utm_campaign=general&gclid=CjwKCAjw4_H6BRALEiwAvgfzq9s03BR1OhlvxwN6SCn6Q_bIKODk3bQK05gwdaHTpwvzV2d7mXQU9hoCSl4QAvD_BwE

但您可能希望使用与您在服务器上使用的兼容的东西。

WebSockets

WebSockets 是双工通道,保持打开状态。如果框架被实现和支持,那么客户端 A 和客户端 B 都将被连接,客户端 A 将通过 WebSocket 发送命令,服务器将接收该命令并通过 WebSocket 通知客户端 B。当客户端 B 决定接受挑战时,他会点击按钮,该按钮将通过 WebSocket 向服务器发出自己的命令,服务器将通过 WebSocket 通知客户端 A。见:https://developer.mozilla.org/en-US/docs/Web/API/WebSocket

总结

最好将其视为一系列事件和事件处理程序,而不是等待响应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多