我从亚历克斯·麦克考(Alex Maccaw)读这本post,他说:


  最后一个问题是并行发送的Ajax请求。如果用户创建了一条记录,然后立即更新同一条记录,则将同时发送两个Ajax请求,即POST和PUT。但是,如果服务器在“创建”请求之前处理“更新”请求,则它会发疯。由于尚未创建记录,因此不知道需要更新哪些记录。
  
  解决方案是通过管道处理Ajax请求,以串行方式传输它们。 Spine缺省执行此操作,对POST,PUT和DELETE Ajax请求进行排队,以便一次发送一个。仅在前一个请求成功返回之后才发送下一个请求。


但是HTTP规范Sec 8.1.2.2 Pipelining 表示:


  客户端不应该使用非等幂方法或非等幂方法序列来流水线请求(请参阅第9.1.2节)。否则,传输连接的过早终止可能导致不确定的结果。


那么,Spine是否真的“管道化”了POST?

最佳答案

Maccaw在这里使用的术语“管道”和HTTP规范是不同的。实际上,他们是相反的。

在HTTP规范中,术语“流水线”是指发送多个请求而无需等待响应。 See section 8.1.2.2


  支持持久连接的客户端可以“管道化”其
     请求(即,发送多个请求而不等待每个请求
     响应)。


基于此定义,您可以了解为什么规范会强烈建议不要对非幂等请求进行管道传输,因为其中一个管道化请求可能会更改应用程序的状态,从而产生意外结果。

当Maccaw撰写spine的“流水线”时,他实际上是指解决方案,即根据HTTP规范,客户端将“流水线”请求而不等待响应。也就是说,spinejs会将请求排队并按顺序提交,每个连续的请求仅在其前任完成后才发出。

关于javascript - spine.js:它真的“流水线”过帐吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16290134/

10-12 15:32