Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 处理ajax保存的HTTP超时_Javascript_Jquery_Ajax - Fatal编程技术网

Javascript 处理ajax保存的HTTP超时

Javascript 处理ajax保存的HTTP超时,javascript,jquery,ajax,Javascript,Jquery,Ajax,我有一个JavaScript应用程序,可以定期保存新的和更新的数据。然而,我需要它的工作缓慢的连接以及 数据在一个HTTP POST请求中提交。响应将为新创建的记录返回新插入的ID 我发现提交的数据已完全保存,但有时返回结果超时。因此,浏览器应用程序不知道数据已成功提交,将再次尝试保存 我知道我可以在浏览器中检测超时,但如何确保数据正确保存 处理这个案件有哪些好方法 我从这里看到,我可以包括一个未决状态: 从服务器获取事务号 发送数据,在服务器上保存为挂起 如果挂起的事务已经存在,请不要覆盖数

我有一个JavaScript应用程序,可以定期保存新的和更新的数据。然而,我需要它的工作缓慢的连接以及

数据在一个HTTP POST请求中提交。响应将为新创建的记录返回新插入的ID

我发现提交的数据已完全保存,但有时返回结果超时。因此,浏览器应用程序不知道数据已成功提交,将再次尝试保存

我知道我可以在浏览器中检测超时,但如何确保数据正确保存

处理这个案件有哪些好方法

我从这里看到,我可以包括一个未决状态:

  • 从服务器获取事务号
  • 发送数据,在服务器上保存为挂起
  • 如果挂起的事务已经存在,请不要覆盖数据,而是将相同的结果发送回
  • 如果收到成功消息,则提交挂起的事务
  • 如果返回错误,请稍后重试
  • 如果超时,请稍后重试

但是,我正在寻找一个更简单的解决方案?

您可以将多次重试计算为一个简单的全局整数。 您也可以自动重试,但这不适合自动保存应用程序。
第三种选择是使用。

实际上,您似乎需要弄清客户机认为数据没有保存,但实际上确实保存了的原因。如果问题纯粹是时间问题,那么可能只需要延长客户端超时时间,这样它就不会过早放弃,或者需要减少响应中发送回的数据量,以便在慢速链接上更快地返回响应

但是,如果你不能通过这种方式解决问题,那么有很多可能围绕这个问题进行规划:

  • 服务器可以跟踪来自每个客户机的最后一个保存请求(或此类请求的散列),如果它看到来自同一客户机的重复保存请求,则可以简单地返回类似“已保存”的内容

  • 可以修改服务器中的代码流,以便在数据库操作提交后立即将小响应发送回客户机(任何其他类型的后端操作都不会延迟),从而减少客户机在保存数据后超时的机会

  • 客户机可以为每个保存请求生成一个唯一的ID,如果服务器看到在多个请求上使用相同的saveID,那么它可以知道客户机认为它只是想再次保存此数据

  • 在任何类型的失败之后,在重试之前,客户机都可以查询服务器,查看上一次保存尝试是成功还是失败

  • 几点建议

    • 增加超时时间,不要将超时处理为成功
    • 您可以使用
      ob\u flush
      flush
      立即刷新每个记录的输出
    • 因为你是在定期提出要求。在每个API调用上检查
      connection\u aborted
      方法,如果客户端已断开连接,您可以将响应保存在临时文件中,在下一个请求中,您可以使用新响应追加上一个响应,但此方法消耗的资源更多

    我知道如何在服务器中检测超时,但客户端仍然不知道数据是否已无误保存或请求是否超时。服务器可以检测到来自同一客户端的重复保存请求,并向客户端返回某种“已保存”代码。可以修复服务器以减少保存数据的机会,但不会将响应发送回客户端(特别是在响应相对较小的情况下)。感谢@jfriend00,等待任何其他答案,但我可以看到这将如何工作。如果请求失败,您可以增加超时时间。这是一个失败。成功处理超时是一种不好的做法。此外,这完全取决于您发送的数据,如果您发送的数据非常小,您可以重试,或者尝试将响应保存到临时文件。存储并在下一个请求时返回响应。这将是一种更消耗资源的方法。再次感谢,我已经实现了你的建议1。该应用程序应该在接收不好的区域工作,也可以脱机工作。因此,更长的超时时间不一定会有帮助。