http必须是请求/响应协议吗?

时间:2017-03-06 20:53:23

标签: ajax http xmlhttprequest

我不得不问一个悲伤的问题。我知道http通常是请求 - 响应。可以请求完成吗?

我们有一种情况,我们希望将ajax调用发送到一台服务器,然后在完成后将表单发送到另一台服务器。我们不能在没有协调它们的情况下发送它们,因为帖子使浏览器导航到另一台服务器,我们失去了我们的上下文。

当我正在做的是做第一个ajax调用,然后在它的回调中,我正在做文档['order-form']。submit()。我的老板指出,如果ajax调用暂时没有完成,用户将看到他的浏览器没有进展,即使它仍然响应。他希望我对ajax调用进行合理的超时。

但实际上,ajax调用是一个“不错但不必要”的东西。如果我们能发送它并忘记它,我的老板会同样高兴。

我在为Google制定合适的查询方面遇到了很多麻烦。 “像UDP一样使用HTTP”不起作用。很多事情都行不通。是时候问人了。

4 个答案:

答案 0 :(得分:1)

如果查看ISO-OSI网络模型,HTTP是应用层协议,UDP位于传输层。 HTTP通常使用TCP,很少使用UDP。然而,RTP(实时传输协议)使用UDP并用于媒体流。还有一件事,UDP不会向您保证100%传输,而TCP会尝试(当检测到数据包丢失时,TCP会尝试重新传输)。所以我们预计UDP下降。所以,当你说 - 开火而忘记 - 当你的包裹无法到达时会发生什么?

所以我猜你在UDP和HTTP之间感到困惑(如果情况并非如此,我很抱歉,因为我现在还没有意识到这种情况,因此网页上存在使用UDP的HTTP)

最好的方法,恕我直言,协调这样的异步过程就是要有一个AJAX调用(如果需要的话启用了CORS),就像你当前所写的一样,加上良好的UI / UX前端,智能地显示进度/最终用户的状态。

另外 - 也许我们可以调整使AJAX响应变慢的过程。但是,一个应该返回数据的数据库调用可以稍微调整一下。

答案 1 :(得分:0)

这是Eric Bidelman所说的:

// Listen to the upload progress.
  var progressBar = document.querySelector('progress');
  xhr.upload.onprogress = function(e) {
    if (e.lengthComputable) {
      progressBar.value = (e.loaded / e.total) * 100;
      progressBar.textContent = progressBar.value; // Fallback for unsupported browsers.
    }
  };

我认为这有一个答案的细菌。 1)我们可以找出请求何时完全消失。 2)我们可以选择不提供响应处理程序。

一旦您收到请求已经结束,您就可以采取下一步措施,包括导航到另一个页面。

但我不确定有多少浏览器支持xhr.upload.onprogress

答案 2 :(得分:0)

如果值得做的事情,肯定值得知道你所要求的是否已经完成。否则,您如何调试问题或提供任何良好的用户体验?

响应是任何类型的响应,它不需要携带消息体。一个简单的204响应可以表明某些事情成功,而403或401可能需要更多的行动。

答案 3 :(得分:0)

我想我已经找到了答案。它非常简单。适用于所有浏览器。

只需将xhr.timeout = 100;添加到您的ajax调用中即可。如果它需要服务器一整秒才能响应,你就不在乎了。你已经以1/10秒的速度前进了。

所以在我的情况下,我将document['order-form'].submit()放在我的超时处理程序中。浏览器导航后,我确信请求已完成。

不使用任何深奥的协议知识或任何最近的创新。

相关问题