RequireJS后备或检查文件是否存在

时间:2014-10-29 00:17:50

标签: javascript 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配置中定义的路径。我想要一个标准需求调用的完全相同类型的功能。

我还发现require.definedrequire.specified但是,似乎只能处理通过require.config定义的模块或尝试加载给定模块后的模块。

1 个答案:

答案 0 :(得分: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的第二个函数。加载模块失败时将调用它。