innerRequire = avalon.require = function(array, factory, parentUrl) {
if (!Array.isArray(array)) {
avalon.error("require的第一個參數必須是依賴列數,類型爲數組 " + array)
}
var deps = {} // args的另外一種表現形式,爲的是方便去重
var id = parentUrl || "callback" + setTimeout("1")
/* setTimeout("1")
*
* setTimeout() 方法的返回值是一個惟一的數值,這個數值有什麼用呢?若是你想要終止 setTimeout() 方法的執行,那就必須使用 clearTimeout() 方法來終止,
* 而使用這個方法的時候,系統必須知道你到底要終止的是哪個 setTimeout() 方法
* (由於你可能同時調用了好幾個 setTimeout() 方法),這樣 clearTimeout() 方法就須要一個參數,
* 這個參數就是 setTimeout() 方法的返回值 (數值),用這個數值來惟一肯定結束哪個 setTimeout() 方法。
* 在系統中每次調用一次,就會遞增一次
*
*/
parentUrl = getBaseUrl(parentUrl)//獲取模塊加載的根目錄
/*
* function getBaseUrl(parentUrl) {
return kernel.baseUrl ? kernel.baseUrl : parentUrl ?
parentUrl.substr(0, parentUrl.lastIndexOf("/")) :
kernel.loaderUrl
}
kernel在配置系統模塊能夠找到,該對象主要是處理咱們本身配置的條件。
*/
//加載每一個依賴的文件
array.forEach(function(el) {
var url = loadResources(el, parentUrl) //加載資源,並返回能加載資源的完整路徑
if (url) {
if (!deps[url]) {//去重:若是deps中存在url,那就不用加入到依賴項數組中
args.push(url)
deps[url] = "司徒正美" //去重:
}
}
})
if (!modules[id]) {
//若是此模塊是定義在另外一個JS文件中, 那必須等該文件加載完畢
//才能放到檢測列隊中
loadings.push(id)
}
if (!modules[id] || modules[id].state !== 2) {
modules[id] = makeModule(id, 1, factory, deps, args)//更新此模塊信息
}
checkDeps()
}