这里unLoadedUris的数组长度为2 ,['https://localhost/test/SEAJS/a.js','http://localhost/test/SEAJS/lib/juqery/1.7.2/juqery-debug.js'],所以 接下来会产生两个以 js路径为名称的闭包。
复制代码 代码如下:
cachedModules('https://localhost/test/SEAJS/a.js') = new Module('https://localhost/test/SEAJS/a.js',1)
module.status >= STATUS.FETCHED ? onFetched() : fetch(uri, onFetched)
因为此时a模块并没有加载 所以接下来将会执行 fetch(uri, onFetched) 即fetch('https://localhost/test/SEAJS/a.js',onFetched)。
复制代码 代码如下:
function fetch(uri, onFetched) {
// 根据map中的规则替换uri为新的请求地址
var requestUri = util.parseMap(uri)
// 首先在已获取列表中查找是否含有requestUri记录
if (fetchedList[requestUri]) {
// 这个时候将原始uri的module存储信息刷新到通过map重定义的requestUri上
cachedModules[uri] = cachedModules[requestUri]
// 执行onFetched 并返回,意味着模块已经获取成功了
onFetched()
return
}
//在获取列表中查询 requestUri 的存储信息
if (fetchingList[requestUri]) {
//在callbacklist中加入该uri对应下的callback,并返回
callbackList[requestUri].push(onFetched) //如果正在获取中,就把此模块的onFetched回调方法push进数组中,并返回。
return
}
// 如果尝试获取的模块都未出现在fetchedList和fetchingList中,则分别在请求列表和回调列表中添加其信息
fetchingList[requestUri] = true
callbackList[requestUri] = [onFetched]
// Fetches it
Module._fetch(
requestUri,
function() {
fetchedList[requestUri] = true
// Updates module status
// 如果 module.status 等于 STATUS.FECTCHING ,则修改module状态为FETCHED
var module = cachedModules[uri]
if (module.status === STATUS.FETCHING) {
module.status = STATUS.FETCHED
}
if (fetchingList[requestUri]) {
delete fetchingList[requestUri]
}
// Calls callbackList 统一执行回调
if (callbackList[requestUri]) {
util.forEach(callbackList[requestUri], function(fn) {
fn() //fn就是模块a对应的onFeched方法。
})
delete callbackList[requestUri]
}
},
config.charset
)
}
接下来 将会执行 Module._fetch(),这里的回调函数我们称作为callback3.