日期:2014-05-16  浏览次数:20811 次

[原创] jQuery源码分析-15AJAX-前置过滤器和请求分发器

?

边读边写,不正确的地方,还请各位告诉我,多多交流共同学习。

15.4??????? AJAX中的前置过滤器和请求分发器

jQuery1.5以后,AJAX模块提供了三个新的方法用于管理、扩展AJAX请求,分别是:

l? 前置过滤器 jQuery. ajaxPrefilter

l? 请求分发器 jQuery. ajaxTransport

l? 类型转换器 ajaxConvert

这里先分析前置过滤器和请求分发器,类型转换器下一节再讲。

15.4.1? 前置过滤器和请求分发器的初始化

前置过滤器和请求分发器在执行时,分别遍历内部变量prefilterstransports,这两个变量在jQuery加载完毕后立即初始化,初始化的过程很有意思。

首先prefilterstransports被置为空对象:

prefilters = {}, // 过滤器

transports = {}, // 分发器

然后,创建jQuery.ajaxPrefilterjQuery.ajaxTransport,这两个方法都调用了内部函数addToPrefiltersOrTransportsaddToPrefiltersOrTransports返回一个匿名闭包函数,这个匿名闭包函数负责将单一前置过滤和单一请求分发器分别放入prefilterstransports。我们知道闭包会保持对它所在环境变量的引用,而jQuery.ajaxPrefilterjQuery.ajaxTransport的实现又完全一样,都是对Map结构的对象进行赋值操作,因此这里利用闭包的特性巧妙的将两个方法的实现合二为一。函数addToPrefiltersOrTransports可视为模板模式的一种实现。

ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), // 通过闭包保持对prefilters的引用,将前置过滤器添加到