【发布时间】:2013-09-16 02:44:37
【问题描述】:
我正在构建一个允许用户同时执行多个操作的网络应用程序。例如,用户可以打开列表、删除列表或添加新列表。
每个动作都会进行一次 ajax 调用并执行回调函数以在成功时更新 UI。我想确保这些操作以序列化的方式执行,这样 UI 就不会不同步。例如,如果用户打开一个列表,但在几分之一秒后删除了该列表,这取决于哪个 ajax 调用先完成,它可能会显示现在应该删除的列表。
为了实现这一点,对于每个操作,我想等到 ajax 调用和它的回调函数完成。我怎样才能做到这一点?
【问题讨论】:
-
如何在回调函数启动时禁用 UI 元素,并在回调完成时重新启用它们?正如 N1ck 在下面指出的那样,
.always处理程序将是重新启用您的 UI 元素的地方。 -
但是,如果我有多个同时进行的 ajax 调用将无法正常工作。
-
啊,所以你想要顺序控制。我可以提出一个替代方案并建议您不要这样做吗?这样的系统有很多方法可以解决问题。如果用户在瞬间启动操作 A 和 B,但 A 导致错误怎么办?如果服务器在 A 之前收到对 B 的请求怎么办?为什么不建立一个更健壮的客户端状态呢?以您的示例为例,当用户单击“删除”时,让客户端状态立即删除该项目。如果客户端随后收到“查看”该项目的命令,它会拒绝。
-
是的,我想要一个序列控制。我懂了。但是,如果用户删除了一个项目,但请求在服务器端失败(例如,由于某些约束违反)怎么办?然后,该列表在客户端被删除,即使它实际上不是。
-
在这种情况下,客户端对删除回调的响应可能是取消删除项目的错误处理程序。假设这是一种通常不会失败的删除操作,这可以让您的应用程序看起来真的快,因为该项目会立即从用户视图中删除。
标签: javascript ajax