需要JS回退或检查文件是否存在

RequireJS fallback or checking for file existance

本文关键字:文件 是否 存在 检查 JS 回退 需要      更新时间:2023-09-26

我想创建一个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的回退,但这些回退仅适用于在require-config中定义的路径。我希望标准require调用具有完全相同类型的功能。

我还发现了require.definedrequire.specified,但同样,似乎只适用于通过require.config或在尝试加载给定模块后定义的模块。

在我看来,您似乎想要使用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的第二个函数。当加载模块失败时,将调用它。