JQuery/JavaScript线程问题-模态对话框

JQuery/JavaScript线程问题-模态对话框,javascript,jquery,jquery-ui,modal-dialog,Javascript,Jquery,Jquery Ui,Modal Dialog,好吧,这可能是个愚蠢的问题,所以请事先原谅我。我有一个网页内容,其中大部分不重要,我需要同步进行大约100个ajax调用,只是因为我不知道如何在JavaScript中进行异步/多线程处理,而且我不想重击正在调用的服务器 因为这需要一段时间,所以我尝试使用jQuery对话框http://jqueryui.com/demos/dialog/option-modal 显示模式对话框,以便用户知道这将需要一段时间。我的函数如下所示: $("#modalDiv").dialog({ modal: true

好吧,这可能是个愚蠢的问题,所以请事先原谅我。我有一个网页内容,其中大部分不重要,我需要同步进行大约100个ajax调用,只是因为我不知道如何在JavaScript中进行异步/多线程处理,而且我不想重击正在调用的服务器

因为这需要一段时间,所以我尝试使用jQuery对话框http://jqueryui.com/demos/dialog/option-modal 显示模式对话框,以便用户知道这将需要一段时间。我的函数如下所示:

$("#modalDiv").dialog({ modal: true, title: "Calling server" });
for (var i = 0; i < callsToMake.length; i++) {
    // make a call
}

问题是模态对话框出现了,但直到我的调用完成才出现,这是毫无意义的。我错过了什么?提前谢谢

一个选项可能是在对话框打开后使用setTimeout强制执行长时间运行的调用

$("#modalDiv").dialog({ modal: true, title: "Calling server" });
setTimeout(function() {
  for (var i = 0; i < callsToMake.length; i++) {
    // make a call
  }
  $("#modalDiv").dialog("close"); //close the dialog
}, 500);

我制作了一个模拟ajax调用的可能解决方案示例:

基本上,您必须创建一个类似的机制,以确保您的呼叫已通过服务器进行,并返回您的信息。。然后,使用收到的数据更新ui,并检查收集的数据,以查看是否已进行了所有调用,如果已进行调用,则只需关闭模式


这个样品不是很好,我只是做得很好。。但这仅仅是为了展示这个概念。

同步发出请求并不会减少服务器上的负载,它只会让用户的浏览器没有响应。您应该考虑的是如何将服务器调用减少到1。如果不能做到这一点,则需要跟踪AJAX调用何时完成

要跟踪所有呼叫何时完成,您可以使用以下两种方法之一进行跟踪。没有足够的代码来构建您的代码示例,因此下面是一个简短的说明

最简单/黑客 使用事件

这里的想法是循环并发出所有ajax调用。假设当时只有这些电话在通话。在运行$.ajax 100次之后,注册ajaxStop事件。当所有ajax事件完成时,将发出此回调。然后可以关闭该对话框

正道 了解对象。我不会假装这很容易


您可以创建一个延迟对象,该对象知道所有ajax调用。当它们全部完成后,您可以启动对话框。关闭。如果你对这种方法感兴趣,我可以提供一个简短的例子。否则,使用上面的hack,它将在简单的情况下工作。

我有一个非常类似的问题:

作为一般解决方案,这将是算法:

showModal();
setTimeout(function() {
  doLongJob();
  removeModal();
}, 200);

当我说我需要同步运行它们时,我的意思是一次运行1个。我不想让几百个请求同时命中我的服务器。谢谢你!我想看一个不同物体的例子,谢谢!如果希望同步请求一次执行一个请求,则永远不应该进行同步请求。您将使第一个ajax返回从下一个开始。但是,如果同时发布所有内容,然后组织结果,则效率要高得多。因此,根据您的意愿,我在这里描述的流程可以按照以下要点实施: