Javascript 未调用RequireJS错误回调(errback)

Javascript 未调用RequireJS错误回调(errback),javascript,error-handling,requirejs,Javascript,Error Handling,Requirejs,我正在使用RequireJS编写一个模块化web应用程序,用于模块加载和依赖项注入 从我的bootstrap.js文件中,我加载Application.js,并对其进行初始化,传入一组将由应用程序“加载”(1)的模块。初始化完成后,应用程序将调用一个函数来表示加载完成 我使用require([“module”]、callback(module)、callback(error))异步加载模块(关于彼此) 我遇到的问题是,当模块加载失败时(至少在Chrome上,当服务器响应404状态代码时),不会调

我正在使用RequireJS编写一个模块化web应用程序,用于模块加载和依赖项注入

从我的
bootstrap.js
文件中,我加载
Application.js
,并对其进行初始化,传入一组将由
应用程序“加载”(1)的模块。初始化完成后,
应用程序
将调用一个函数来表示加载完成

我使用
require([“module”]、callback(module)、callback(error))
异步加载模块(关于彼此)

我遇到的问题是,当模块加载失败时(至少在Chrome上,当服务器响应404状态代码时),不会调用错误回调(errback)

我可以在Google Chrome开发者工具控制台中看到该错误,但不会调用errback:

GET http://192.168.1.111:8812/scripts/modules/InexistentModule/manifest.js 404 (Not Found) 
Uncaught Error: Load timeout for modules: modules/InexistentModule/manifest 
有没有人曾经用RequireJS errbacks解决过这个问题?如果是,怎么做

(1) 实际上,我只是加载模块清单,而不是整个模块,这样我就可以显示它们的图标,并使用Backbone.subcure注册它们的路由

我正在使用的库(没有缩小):

  • RequireJS 1.0.8
  • 下划线1.6.0
  • jQuery 1.11.0
  • 主干1.1.2
  • 主干线0.4.1
在上面的库中,目前我只直接使用RequireJS和下划线

我在将成功/失败回调传递到Require时使用了下划线,以便将
I
作为
index
参数从我的循环中传入。对于成功回调,它工作得非常好,我认为这不会影响errback(我已经用一个简单的arity 1函数进行了测试,而不是用
\uuu.partial
返回的分部函数,并且在404错误的情况下仍然不会调用该函数)

我将在这里发布我的
bootstrap.js
Application.js
文件,因为它们可能会提供更多信息

谢谢大家!

bootstrap.js

require.config({
    catchError: true,
    enforceDefine: true,
    baseUrl: "./scripts",
    paths: {
        "jquery": "lib/jquery",
        "underscore": "lib/underscore",
        "backbone": "lib/backbone",
        "backbone.subroute": "lib/backbone.subroute"
    },
    shim: {
        "underscore": {
            deps: [],
            exports: "_"
        },
        "backbone": {
            deps: ["jquery", "underscore"],
            exports: "Backbone"
        },
        "backbone.subroute": {
            deps: ["backbone"],
            exports: "Backbone.SubRoute"
        }
    }
});

define(["jquery", "underscore", "backbone", "Application"],
    function ($, _, Backbone, Application) {
        var modules = ["Home", "ToS", "InexistentModule"];
        var defaultModule = "Home";

        var onApplicationInitialized = function()
        {
            require(["ApplicationRouter"], function(ApplicationRouter){
                ApplicationRouter.initialize();
            });
        }

        Application.initialize(modules, defaultModule, onApplicationInitialized); 
    }
);
define([
    'jquery',
    'underscore',
    'backbone'],
function($,_,Backbone){
    var modules;
    var manifests = [];
    var routers = [];
    var defaultModule = "";

    var totalModules = 0;
    var loadedModules = 0;
    var failedModules = 0;
    var onCompleteCallback = function(){};

    var onModuleManifestLoadComplete = function(index, manifest){
        manifests[index] = manifest;
        console.log("Load manifest for module: " + modules[index] + " complete");
        //TODO: init module 
        loadedModules++;
        if(totalModules == (loadedModules + failedModules))
            onCompleteCallback();
    };

    var onModuleManifestLoadFailed = function(index, err){
        console.log("Load manifest for module: " + modules[index] + " failed");
        failedModules++;
        if(totalModules == (loadedModules + failedModules))
            onCompleteCallback();
    }; 

    var initialize = function(_modules, _defaultModule, callback){
        defaultModule = _defaultModule;
        modules = _modules;
        manifests = Array(modules.length);
        totalModules = modules.length;
        onCompleteCallback = callback;

        for(i=0; i<modules.length; i++){
            require(['modules/'+modules[i]+'/manifest'], 
                _.partial(onModuleManifestLoadComplete, i),
                _.partial(onModuleManifestLoadFailed, i));
        };
    };

    return {
        modules: modules,
        manifests: manifests,
        routers: routers,
        defaultModule: defaultModule,
        initialize: initialize
    };
});
Application.js

require.config({
    catchError: true,
    enforceDefine: true,
    baseUrl: "./scripts",
    paths: {
        "jquery": "lib/jquery",
        "underscore": "lib/underscore",
        "backbone": "lib/backbone",
        "backbone.subroute": "lib/backbone.subroute"
    },
    shim: {
        "underscore": {
            deps: [],
            exports: "_"
        },
        "backbone": {
            deps: ["jquery", "underscore"],
            exports: "Backbone"
        },
        "backbone.subroute": {
            deps: ["backbone"],
            exports: "Backbone.SubRoute"
        }
    }
});

define(["jquery", "underscore", "backbone", "Application"],
    function ($, _, Backbone, Application) {
        var modules = ["Home", "ToS", "InexistentModule"];
        var defaultModule = "Home";

        var onApplicationInitialized = function()
        {
            require(["ApplicationRouter"], function(ApplicationRouter){
                ApplicationRouter.initialize();
            });
        }

        Application.initialize(modules, defaultModule, onApplicationInitialized); 
    }
);
define([
    'jquery',
    'underscore',
    'backbone'],
function($,_,Backbone){
    var modules;
    var manifests = [];
    var routers = [];
    var defaultModule = "";

    var totalModules = 0;
    var loadedModules = 0;
    var failedModules = 0;
    var onCompleteCallback = function(){};

    var onModuleManifestLoadComplete = function(index, manifest){
        manifests[index] = manifest;
        console.log("Load manifest for module: " + modules[index] + " complete");
        //TODO: init module 
        loadedModules++;
        if(totalModules == (loadedModules + failedModules))
            onCompleteCallback();
    };

    var onModuleManifestLoadFailed = function(index, err){
        console.log("Load manifest for module: " + modules[index] + " failed");
        failedModules++;
        if(totalModules == (loadedModules + failedModules))
            onCompleteCallback();
    }; 

    var initialize = function(_modules, _defaultModule, callback){
        defaultModule = _defaultModule;
        modules = _modules;
        manifests = Array(modules.length);
        totalModules = modules.length;
        onCompleteCallback = callback;

        for(i=0; i<modules.length; i++){
            require(['modules/'+modules[i]+'/manifest'], 
                _.partial(onModuleManifestLoadComplete, i),
                _.partial(onModuleManifestLoadFailed, i));
        };
    };

    return {
        modules: modules,
        manifests: manifests,
        routers: routers,
        defaultModule: defaultModule,
        initialize: initialize
    };
});
定义([
“jquery”,
“下划线”,
“主干”],
函数($,389;,主干){
var模;
var清单=[];
var=[];
var defaultModule=“”;
var totalModules=0;
var loadedModules=0;
var failedModules=0;
var onCompleteCallback=函数(){};
var onModuleManifestLoadComplete=函数(索引,清单){
舱单[索引]=舱单;
log(“模块的加载清单:“+模块[索引]+”完成”);
//TODO:初始化模块
loadedModules++;
如果(totalModules==(loadedModules+failedModules))
onCompleteCallback();
};
var onModuleManifestLoadFailed=函数(索引,错误){
log(“模块的加载清单:“+模块[索引]+”失败”);
failedModules++;
如果(totalModules==(loadedModules+failedModules))
onCompleteCallback();
}; 
var initialize=函数(_modules,_defaultModule,callback){
defaultModule=\u defaultModule;
模块=_模块;
清单=数组(modules.length);
totalModules=modules.length;
onCompleteCallback=回调;

对于(i=0;i您表示您正在使用RequireJS 1.0.8。我检查了1.x系列的文档,但没有找到任何关于errbacks的信息。这实际上表明errbacks是在2.x系列中引入的


另外,
垫片
是在2.x系列中引入的。因此,现在,RequireJS忽略了您的垫片。

您表示您正在使用RequireJS 1.0.8。我查看了1.x系列的文档,没有发现任何关于错误反馈的信息。这实际上表明在2.x系列中引入了错误反馈


另外,
垫片
是在2.x系列中引入的。因此,现在,RequireJS忽略了您的垫片。

是的,
onModuleManifestLoadComplete
可以工作,并且在加载完现有的
manifest.js
文件后,它会被调用。如果所有模块都退出
onCompleteCallback
也会被调用,并且
bootstrap.js
中的
路由器
会被初始化。当至少一个模块加载失败时,就会出现问题。如果您仅使用一个不存在的模块进行测试,并且您在问题中显示的代码会加载该模块,那么会像您预期的那样调用错误返回吗(这是一个远大的目标,但一些关于SO的问题是通过这种方式解决的,所以…)你运行的是最新版本的RequireJS吗?我只测试了一个不存在的模块,没有调用errback。我已将库版本添加到我的问题中。是的,
onModuleManifestLoadComplete
可以工作,并且在加载完所有现有的
manifest.js
文件后都会调用它。如果所有模块退出
onCompleteCallback
也会被调用,并且
bootstrap.js
中的
Router
会被初始化。当至少有一个模块加载失败时,就会出现问题。如果您只使用一个不存在的模块进行测试,并且您在问题中显示的代码会加载该模块,那么会像您预期的那样调用错误返回吗?另外(这是一个很长的机会,但是一些问题是通过这种方式解决的,所以…)您运行的是最新版本的RequireJS吗?我只测试了一个不存在的模块,没有调用错误回复。我已将库版本添加到我的问题中。哇!谢谢:)我想在搜索“最新”版本和更新库时,我可能会登录到1.x页面。我已将库更新到2.1.11,并且会调用errback。我不会想进一步检查版本。再次感谢您!哇!谢谢:)我想在搜索库时,我可能会登录到1.x页面“最新”版本和更新库。我已更新