【发布时间】:2014-10-19 15:03:08
【问题描述】:
我正在开发一款使用大量 AJAX 调用来更新、保存、编辑保存游戏等的游戏。
事情是,随后启动的 AJAX 请求似乎没有像我想要的那样排队。
例如,我正在检查服务器端是否允许执行某项操作,因此我需要当前保存的游戏。保存游戏之前发送,但检查请求在保存游戏请求完成之前执行。
所以我希望它是这样的:
AJAX start: Save Game
AJAX finish: Save Game
AJAX start: Check
AJAX finish: Check
AJAX start: Save Game
AJAX finish: Save Game
目前更像这样:
AJAX start: Save Game
AJAX start: Check
AJAX finish: Save Game
AJAX start: Save Game
AJAX finish: Check
AJAX finish: Save Game
即使 AJAX 调用按正确的顺序触发。他们只需要等到之前触发的调用完成。
有没有办法在全球范围内实现这一目标?因为问题是大多数调用都不知道其他请求。
我可以在不调用setInterval 来检查请求是否完成的情况下完成这项工作吗?
更新:显然,我并没有解决实际问题。我知道这是因为 AJAX 是异步的。
但我需要那些留在队列中。同样在运行时,我不知道什么时候触发了哪些调用,因为这完全取决于用户操作。所以我无法在save 请求之后调用check 请求,因为我不知道用户是否触发了需要调用check 请求的操作。
所以我需要一个全局实现,其中 ajax 请求总是等待它们的执行,直到预先存在的每个请求都完成。
所以我希望这些调用是异步的(不冻结 UI 等),但在执行顺序方面“同步”。
【问题讨论】:
-
是的。在第一个的回调中设置下一个请求。
-
这是因为ajax请求的异步性...
-
使用从 ajax 调用返回的
promises。您可以根据需要并行或顺序或组合运行任何数量。 使用回调会在代码中引入你可能不想要的依赖关系。 -
正如更新版本和 Praveen Kumars 回答下方的评论所暗示的那样:我基本上想要一个请求来检查,如果当前有请求正在运行。如果不是,则触发请求,如果是,则该请求应等待所有其他请求完成。
标签: javascript jquery ajax asynchronous