序列化POST请求jQuery/Javascript

3
我正在开发一个应用程序,它每1500毫秒发送一次AJAX POST请求(我目前使用的是jQuery)。我注意到大多数情况下,这些请求在350-450毫秒内成功,并按照生成顺序很好地发送到服务器。
然而有时候,其中一两个请求需要近3-4秒才能被处理,并且稍后才被传递。在我的应用程序中,我需要确保这些请求以从客户端发送的相同顺序接收到服务器。我该怎么做?我目前使用的是setInterval每1500毫秒调用一个函数(该函数生成要发布的数据),并使用$.ajax()进行发布。但是,如何对请求进行串行化?
4个回答

2

不确定如何在JavaScript中实现,但您可以创建一个请求列表或数组,按照先进先出的方式排列,因此当准备好时,您将请求或其他需要创建请求的值推入数组中,在一定时间间隔后,从数组中取出并发送请求。基本上,您将以这种方式排队您的请求。


那将是一个不错的解决方案。只需记得在失败和成功的ajax请求中都要继续队列。 - chelmertz
1
我不明白那与他现在所做的有何不同。 - Josh Stodola
是的,基本上我不关心要排序的数据生成 - 我会按正确顺序发送它们 - 但有些请求需要更长时间,而其他在它们之后发送的请求却在它们之前成功了。 - jeffreyveon

0
以下代码将在等待服务器响应后,启动1500毫秒的计时器以发起下一个请求...
$(function() {
  var recursive = arguments.callee;
  $.post("http://url", { /* data */ }, function() {
    setTimeout(recursive, 1500);
  });
});

0
一种方法是在js中发送一个时间戳,并在接收端将每个调用添加到队列中,然后通过按timestamp DESC排序来执行它。
如果您提供有关实际发生情况的更多信息,也许可以根据请求类型(例如,预期响应时间有多长?)调整间隔。

0

在异步设置中,您无法保证响应的顺序。但是,您可以:

  1. 在请求和响应上添加序列号(或时间戳)。
  2. 在接收到每个响应时,使用序列号作为键将结果存储在全局存储中。
  3. 运行一个单独的setInterval进程,按正确的顺序检查全局存储,处理结果并处理掉。

这将确保结果的串行执行。但需要注意的是,对于超时或错误的请求,不要阻塞后续处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接