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

时间:2011-12-02 23:50:28

标签: javascript jquery jquery-ui modal-dialog

好吧,这可能是一个愚蠢的问题,请提前原谅我。我有一个网页(内容大多不重要),我需要同步进行大约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
}

问题是模态对话框出现,但直到我的电话完成,这是没有意义的。我错过了什么?提前谢谢!

4 个答案:

答案 0 :(得分:0)

一个选项可能是在对话框打开后使用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);

答案 1 :(得分:0)

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

http://jsfiddle.net/px7fc/20/

基本上你必须创建一个类似的机制,以确保你的电话通过服务器进行,​​并带回你的信息..然后你用你收到的数据更新你的ui并检查你的收集,看看是否所有电话已经完成了,如果他们这样做了,你就关闭模态..

这个样本不是很好,我只是做了它工作 ..但它只是为了展示这个概念。

答案 2 :(得分:0)

同步发出请求不会减少服务器的负载,只会使用户的浏览器无响应。您应该考虑的是如何将我的服务器调用减少到1.如果您不能这样做,则需要跟踪AJAX调用何时完成。

要跟踪所有通话的完成时间,您可以采用以下两种方式之一。没有足够的代码来构建代码示例,所以这里有一个简短的描述。

<强>最简单/哈克 使用ajaxStop事件。

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

正确的方式 了解deferred对象。我不会假装这很容易。

您创建了一个知道所有ajax调用的延迟对象。完成后,您可以关闭dialog.close()。如果这种方法引起你的兴趣,我可以提供一个简短的例子。否则,使用上面的hack将在简单的情况下工作。

答案 3 :(得分:0)

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

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

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