javascript框架设计读书笔记之模块加载系统(3)

这里unLoadedUris的数组长度为2 ,['https://localhost/test/SEAJS/a.js','http://localhost/test/SEAJS/lib/juqery/1.7.2/juqery-debug.js'],所以 接下来会产生两个以 js路径为名称的闭包。

为例
接下来 : 首先会创建一个Module:

复制代码 代码如下:


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.

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgsyjw.html