执行同步HTTP请求的"正确"方式

Awo*_*ing 6 javascript ajax jquery scorm

你可能来这里是为了责备我,但这是一个真实的用例.

在线教育领域,有SCORM课程.我必须在网站上使用旧的SCORM课程.SCORM课程是"基于Web的"并在浏览器中运行,但是他们希望在iframe中运行,并且他们希望父级提供GetValue方法和SetValue.

因此,这些SCORM课程正在执行诸如parent.SetValue("得分","90")之类的事情并继续前进.如果有任何问题,该函数应该返回"false".

SCORM来自90年代,在现代网络中,我们知道我们必须做回调/承诺,http经常"失败".您可能认为解决方案是SetValue,它写入本地数据,然后尝试重试直到它完成,但SCORM课程通常设置为仅在SetValue工作时移动到下一个屏幕,因此您不应该放弃除非SetValue实际保存在服务器上,否则用户前进.

TL; DR

假设同步请求是必需的,那么正确的方法是什么?

到目前为止,我知道 $.ajax({async:false ... 但现在浏览器警告这一点,听起来他们只会忽略你的同步请求.我想也许使用websockets或web worker或者某种东西是在现代编程中做同步请求的正确方法.但我不知道如何提出这样的要求.并且我不允许更改SCORM课程的代码(它们是使用各种课程制作工具生成的)

为了澄清,我完全控制了SetValue函数的实现.

$.ajax({async:false ...长期工作吗?(5 - 10年)

注意:在此用例中完全冻结UI直到请求成功或失败完全可以接受.这就是课程所假设的.

Ber*_*rgi 5

到目前为止我知道,$.ajax({async:false…但现在浏览器警告这一点

这是正确的方法(如果你使用的是jQuery),它会发送一个同步的XMLHttpRequest.只是忽略警告.这是一个警告,您使用的是已经知道的过时技术.

听起来他们只会忽略你的同步请求.

这不太可能.

我想也许使用websockets或web worker或者某种东西是在现代编程中做同步请求的正确方法.

不,websockets和web worker总是异步的,你不能使用它们来使你的异步请求看起来是同步的(实际上没有任何东西可以让你这样做).

$.ajax({async:false…长期工作吗?(5 - 10年)

我们无法知道(而且SO不是水晶球).它可能,特别是在旧浏览器中,或者它可能不会.浏览器供应商不愿意破坏运行Web的功能的兼容性,并且仍然需要不时的同步请求.在某些时候,太少(重要)的网页将使用它(<1%,<1‰,无论他们决定什么门槛),浏览器最终会有信心将其删除.那时,您的企业将意识到弃用这些过时的课程制作工具.