2010-07-21 41 views
2

我想知道在多个(无序)ajax调用完成之后触发事件的最佳方法是哪种。在几次ajax调用成功后触发事件

为了让它更清晰些,我想调用一个Method doSomethingGreat(),它会触发几个ajax调用,这些调用的顺序不必要。当所有这些调用都成功时,我只想触发一个事件'SomethingGreatFinished'。我也不想将这些调用链接起来,因为那样会缺乏性能,并且完全违背异步编程的思想。

我想知道a)是否有一个共同的模式,b。)这可以通过JavaScript的Reactive Extensions(RxJs)或c。)来完成,并具有原生的jQuery特性。

任何帮助表示赞赏!

+0

IIRC,你只能有最多两个同时HTTP请求到同一台服务器。当然,两个并行比一个一个更好,所以你是正确的问这个问题,但要注意你不会得到7个并发的ajax调用。 – nickf 2010-07-21 07:20:23

+0

哦,我明白了。我不知道。 – Christoph 2010-07-21 08:20:08

+0

关于同时请求的最大数量的好处,但如果我没有记错,这是一个浏览器设置,并且一些浏览器使用不同的值。 http://weblogs.asp.net/mschwarz/archive/2008/07/21/internet-explorer-8-and-maximum-concurrent-connections.aspx – belugabob 2010-07-21 10:24:47

回答

3

RxJS将允许您使用ForkJoin运算符执行此操作,此运算符将N个observables与一个值相关联,并创建一个observable,并在所有N个observable结束时创建一个与数组一起触发的observable。

见太Podwysocki的博客文章中针对此操作:http://codebetter.com/blogs/matthew.podwysocki/archive/2010/04/23/introduction-to-the-reactive-extensions-for-javascript-going-parallel-with-forkjoin.aspx

+0

我认为这就是我正在寻找的:-) – Christoph 2010-07-23 04:04:52

0

如果您知道正在进行多少次呼叫,请将变量设置为该号码,并在每次发生AJAX完成事件时将其减少一次。当变量达到零时,'SomethingGreat'发生了。

+0

这就是我现在所做的,但我认为必须有一个更好的方式来实现它。也许用JS的Reactive Extensions? – Christoph 2010-07-21 08:19:33

1

你应该看看.ajaxStop()

但是,该callback将启动每个完成的ajax请求。因此,为了知道您的最后一次请求是否完成,您需要调用.ajaxStart(),或者您需要为每个请求重复执行global variable,并且您需要为每个请求重复执行global variable,并且需要对.ajaxStop()重复执行decrement。如果该变量达到zero,您的所有请求都已完成。