2014-10-29 33 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