Javascript Wait unitl ajax及其回调函数finish

Javascript Wait unitl ajax及其回调函数finish,javascript,ajax,Javascript,Ajax,我正在构建一个web应用程序,允许用户同时执行多个操作。例如,用户可以打开列表、删除列表或添加新列表 每个操作都进行一个ajax调用,并执行一个回调函数,以便在成功时更新UI。我希望确保这些操作以序列化的方式执行,以便UI不会失去同步。例如,如果用户打开一个列表,但在几分之一秒后删除了该列表,这取决于最先找到的ajax调用,它可能会显示现在应该删除的列表 为了实现这一点,对于每个操作,我希望等待ajax调用及其回调函数完成。如何实现这一点?使用Jquery,您可以向Ajax调用中添加async:

我正在构建一个web应用程序,允许用户同时执行多个操作。例如,用户可以打开列表、删除列表或添加新列表

每个操作都进行一个ajax调用,并执行一个回调函数,以便在成功时更新UI。我希望确保这些操作以序列化的方式执行,以便UI不会失去同步。例如,如果用户打开一个列表,但在几分之一秒后删除了该列表,这取决于最先找到的ajax调用,它可能会显示现在应该删除的列表


为了实现这一点,对于每个操作,我希望等待ajax调用及其回调函数完成。如何实现这一点?

使用Jquery,您可以向Ajax调用中添加
async:false
,或者使用来确保只有在Ajax调用完成后才发出操作(假设您使用Jquery)

如果您有多个Ajax请求,示例如下:

$.ajax({url: url}).pipe(function() {
  // some ajax stuff
  return $.ajax({});
}).pipe(function() {
  // some more ajax stuff (3rd request)
  return $.ajax({});
}).done(function() {
  // done with all ajax requests...
});

如果使用jQuery,则在
.done()
/
.fail()
之后调用
.always()
回调


在启动回调函数时禁用UI元素,并在回调完成时重新启用它们如何?正如N1ck在下面指出的那样,
.always
处理程序将是重新启用UI元素的地方。但是如果我有多个同时进行的ajax调用,那就不起作用了。啊,所以你想要序列控制。我能提出一个替代方案,建议你不要这样做吗?这样一个系统有太多的方法会崩溃。如果用户在一瞬间启动操作a和B,但a导致错误,该怎么办?如果服务器在A之前收到B的请求怎么办?为什么不构建一个更健壮的客户机状态?以您的示例为例,当用户单击“删除”时,让客户端状态立即删除该项。如果客户端随后收到“查看”该项的命令,它将拒绝。是的,我想要一个序列控件。我懂了。但是,如果用户删除了一个项目,但请求在服务器端失败(例如,由于某些约束冲突),该怎么办?然后,该列表在客户端被删除,即使它实际上不是。在这种情况下,客户端对删除回调的响应可能是一个错误处理程序,它将取消删除该项。假设这是一种通常不会失败的删除操作,这会使您的应用程序看起来非常快,因为该项目会立即从用户视图中删除。这可能不是我想要的。我知道我可以使用
.always()
,但我仍然不知道ajax调用何时完成。对于每个操作,我需要1)执行ajax调用,2)执行回调。然后,我将继续处理下一个操作。您的初始回调是
done()
fail()
,这是在ajax调用完成时,然后在这些回调之后调用
。always()
。您可以使用一个布尔值来表示它当前是否正在执行ajax调用,并阻止执行另一个操作,但这似乎完全违背了使用ajax的目的。如果我同时有多个ajax调用,我不能只使用一个布尔值,因为当其他ajax调用正在进行时,一个调用可能会将其设置为false。我可以使用
$.ajaxStart
$.ajaxStop()
,但是我不知道回调何时完成。我想这确实违背了ajax调用的目的,但我正在尝试同步进行UI更新。有什么建议吗?…根据最先找到的ajax调用,它可能会显示现在应该删除的列表。“我认为您只需要重新考虑在执行ajax调用后如何获得更新的列表,如果他们从不同的浏览器/选项卡中删除了一些内容,该怎么办?”?如果上面的建议不能回答这个问题,我认为你在寻找错误的领域来解决这个问题。此响应(和问题)中未考虑错误处理。
$.ajax("example.php")
    .done(function() {
        alert("success");
    })
    .fail(function() {
        alert("error");
    })
    .always(function() {
        alert("complete"); //Called after done/fail callbacks
    });