首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 Dojo 进行批量 Ajax 请求的多种处理方式(3)

使用 Dojo 进行批量 Ajax 请求的多种处理方式(3)

使用 Dojo 并发的处理多个 Ajax 请求实现原理由于 HTTP 协议是无状态的(Stateless),HTTP 的无状态特性简化了服务器的设计,使服务器更容易支持大量并发的 HTTP 请求。在客户端,采用 Dojo 作为开发工具,由于 dojo.xhr 函数返回的是一个"dojo.Deferred"对象。因此,可以通过管理多个 dojo.xhr 函数返回的 Deferred 对象来管理多个并发的 Ajax 请求。
用 dojo.DeferredList 和 dojox.lang.async.par 实现比较Dojo 中有多种方法管理异步编程对象"dojo.Deferred"。
首先,可以用 dojo.DeferredList 管理多个 Deferred 对象。dojo.DeferredList 本身是一个 dojo.Deferred 的子类。因此,它也有相应的三种状态,也有对应的回调函数。DeferredList 达到"resolved"的条件是所有它所管理的 Deferred 对象都达到"resolved"或"rejected"状态。在下面的例子中,DeferredList 达到"resolved"的条件是所有的 Ajax 请求都返回(不论是成功返回还是出错返回),而 DeferredList 的回调函数获得的参数是一个二元数值对的数组,二元数值对对应了各个 Ajax 请求的返回信息。其中第一个数值是一个 boolean 值,表示 Ajax 请求是否成功返回;第二个数值是 Ajax 请求返回的信息。不论各个 Ajax 请求的返回顺序如何,该数组的顺序对应于传入 DeferredList 的 Deferred 对象的顺序。
同时,我们也可以用 dojox.lang.async 模块中的一个静态函数 dojox.lang.async.par 管理并发的 Ajax 请求管理。这个静态函数接受一个函数的数组作为参数,并返回一个"dojo.Deferred"对象。在管理并发的 Ajax 请求时,可以使得传入的函数返回时调用 dojo.xhr 函数。该函数返回的 Deferred 对象达到"resolved"状态的条件是上述函数数组中的函数成功返回或者函数返回的 Deferred 对象都达到"resolved"状态。否则,该 Deferred 对象进入"rejected"状态。该 Deferred 对象对应"resolved"状态的回调函数能够获得一个数组作为参数,这个数组包含了各个 Ajax 请求的成功返回信息。不论各个 Ajax 请求的返回顺序如何,该数组的顺序对应于传入 dojox.lang.async.par 的函数的顺序。
并发处理多个 Ajax 请求的示例现在,对于我们的音乐管理系统,我们要同时获得所有的轻音乐,民谣,乡村音乐 , 并在 Firebug 的 console 面板显示。清单 6 展示了用上述的两种方法实现的示例。
清单 6. 并发处理 Ajax 请求示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
dojo.require("dojo.DeferredList");
dojo.require("dojox.lang.async");
function getSoftMusic() {
   return dojo.xhrGet({
       url: "/music/softMusic",
       handleAs: "json"
   });
}
function getFolkMusic() {
   return dojo.xhrGet({
       url: "/music/folkMusic",
       handleAs: "json"
   });
}
function getCountryMusic() {
   return dojo.xhrGet({
       url: "/music/countryMusic",
       handleAs: "json"
   });
}
// 利用 dojo.DeferredList 处理并发的 Ajax 请求
var d1 =  getSoftMusic(), d2 =  getFolkMusic(), d3 =  getCountryMusic(),
defList = new dojo.DeferredList([d1, d2, d3]);
defList.then(function(results) {
   dojo.forEach(results, function(result) {
       console.log(result[1]);
   });
});
// 利用 dojox.lang.async.par 处理并发的 Ajax 请求
var arrayOfAjax = [getSoftMusic, getFolkMusic, getCountryMusic];
dojox.lang.async.par(arrayOfAjax)().then(function(results) {
   dojo.forEach(results, function(result) {
       console.log(result);
   });
});




两种解决方案的对比从上面的示例可以看出,上述的两种方法都是用一个 Deferred 对象管理多个 Deferred 对象(DeferredList 是 Deferred 的子类,因此 DeferredList 的实例也可以认为是一个 Deferred 对象)。通过为作为管理者的 Deferred 对象增加回调函数来通知客户端程序多个 Ajax 请求已经返回。
相比之下,用 DeferredList 更为灵活。DeferredList 在默认情况下,会完成所有的 Ajax 请求,即使某一个 Ajax 请求失败了,最后 DeferredList 仍能够触发"resolved"状态的回调函数,并将相应的信息置于回调函数的参数中。而 dojox.lang.async.par 只会在所有的 Ajax 请求成功返回之后才会将各个 Ajax 请求的返回的信息传递给回调函数。当某一个 Ajax 请求失败了,dojox.lang.async.par 会将排在这个请求之后的所有 Ajax 请求取消。并触发"rejected"状态的回调函数
返回列表