何时适合使用同步ajax?

18

我刚刚在阅读有关jQuery同步ajax调用的另一个问题,然后产生了疑问:

什么情况下使用同步版本的ajax调用是有益/必要的?

最好给出一个示例,并说明为什么同步优于标准ajax。


在我看来,从未有过一个好的反对意见可以证明“找到有效的解决方法”不适用于任何情况。但我相信这里的人们可以证明我的想法是错误的。 - wajiw
3
你的问题标题是“逻辑矛盾”,这个事实让我感到很有趣。 - Nathan Taylor
2
@Nathan Taylor 我考虑提到在 jQuery 中 AJAX 是一个用词不当。它可以是同步或异步的,也可以是 xml、json、html 或其他格式。在其他语言中,通常称之为“url 请求”。如果我们叫它那样,不了解内部情况的外行人就不能随意引用这个没有实际意义的热词了。 - zzzzBov
1
可能是重复的问题:有没有理由使用同步XMLHttpRequest? - Bergi
4个回答

21

我能想到的唯一合理的例子(不能通过其他方式解决)是在 window.onbeforeunload 中发起调用,此时你需要它是同步的,否则页面将转移并且请求将永远无法完成。

在这种特定情况下,如果使用标准/异步行为,你几乎可以肯定请求会因提前终止而没有任何影响,或者根本不会与服务器联系。

我并不是说我支持这样做,恰恰相反(因为它会对用户的浏览速度产生负面影响)。但是……这里没有太多选择。


根据我在之前的工作中测试跟踪代码时观察到的情况,我认为几个版本之前(现在可能已经有几年了),Chrome提供了几秒钟的时间让异步AJAX在页面卸载后在后台完成。我不知道其他浏览器是否效仿,但希望它们能够这样做,这样这个答案将有一天会变得过时。 - Mark Amery

-1
总之,请不要像@Brandon所说的那样使用同步请求:它们是一种避免回调的廉价/简单/快速方法。此外,现代浏览器会显示警告,如果进行同步请求,我们不喜欢这样。让你的世界异步化。

-2

同步ajax通常用于从服务器检索需要进一步继续处理客户端代码的值。在这种情况下,ajax调用将阻塞,直到调用返回所需的值为止。例如:

JavaScript函数需要计算员工薪资: 第1步:从表单获取员工ID 第2步:通过同步服务器调用传递emp.id以获取其工资/小时 第3步:将薪资率乘以工作小时数

可以看出,在完成服务器调用之前无法计算总薪资,因此这应该是一个同步函数,虽然如果使用jQuery,则可以处理onSuccess以异步计算薪资,但在此过程中处理将继续,如果有要显示薪资的消息框,它将为空...


2
抱歉,但这完全是错误的,你不应该误导别人。在你提到的情况下,你可以使用回调和/或承诺。这与同步 AJAX 没有任何关系。如果 JS 可以同时处理某些东西呢?如果你进行同步 AJAX,你会冻结选项卡。 - ducin
2
同意,这是很差的建议。这就是为什么回调存在的原因。在这种情况下,同步 AJAX 是一种廉价/简单/快速的解决方案,可以避免编写回调函数。 - Brandon
1
@Brandon 当你有大量嵌套的回调函数,并且需要让函数看起来像同步函数时,尝试将其异步化会非常困难。 - Michael

-4
我猜在某些情况下使用它会很好,比如你想执行一些ajax调用,但是其中一个调用依赖于另一个调用的结果。如果你同步执行它们,你可以等待独立的调用完成后再触发依赖的调用。

1
-1,异步调用可以轻松地排队按顺序发生。一般而言,Promises 用于排队传递失败条件,以便每个异步回调可以在前一个回调成功时按特定顺序发生。此外,它使得单独包含回调的错误处理甚至作为一组变得非常容易。 - zzzzBov
2
即使没有使用 Promise,也可以使用简单的回调函数。 - Brandon

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