2014-10-29 41 views
1

我希望创建一个将理想看起来像这样一个requirejs扩展:RequireJS回退或检查文件所有脑干

var versions = ['one', 'two', 'three']; 

define({ 
    load: function (name, req, onload, config) { 
     var load = function (version) { 
      try { 
       req([name + '.' + versions[version]], function (value) { 
        onload(value); 
       }); 
      } catch(ex) { 
       if (version === versions.length - 1) 
        throw err; 
       load(version + 1); 
      } 
     }; 

     load(0); 
    }); 
}); 

基本上,我想这样做:

require(['plugin!my/file'], function (dep) { 

}); 

而幕后的逻辑应该是:

检查我的/ file.one.js。如果存在,请将其退回。如果没有...

检查我的/ file.two.js。如果存在,请将其退回。如果没有...

检查我的/ file.three.js。如果存在,请将其退回。如果不是......

这个问题似乎是请求不存在从req抛出文件中的错误是异步,所以不能以这种方式被抓。

对于完成这种功能的任何建议?

我找到了requirejs fallbacks,但那些只适用于您的需要配置中定义的路径。我想要一个标准的需求调用完全相同类型的功能。

我也发现require.defined和,但似乎只对通过require.config定义的模块或试图加载给定模块后才起作用。

回答

1

在我看来,你想使用errback。所以像这样:

var versions = ['one', 'two', 'three']; 

define({ 
    load: function (name, req, onload, config) { 
     var load = function (version) { 
      req([name + '.' + versions[version]], function (value) { 
       onload(value); 
      }, 
      function (err) { 
       if (version === versions.length - 1) 
        throw err; 
       load(version + 1); 
      }); 
     }; 

     load(0); 
    }); 
}); 

errback是传递到req第二个函数。它会在加载模块失败时被调用。

+0

这是完美的。不知道errback存在。谢谢! – 2014-10-29 02:24:29

+0

如果文件不存在,这仍然会引发错误 – vher2 2015-07-30 12:15:37