RequireJS错误回调(errback)没有被调用

RequireJS error callback (errback) not getting called

本文关键字:调用 errback 错误 回调 RequireJS      更新时间:2023-09-26

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

从我的bootstrap.js文件我加载Application.js并初始化它,传入一个模块数组,这些模块将被Application"加载"(1)。当初始化完成后,Application将调用一个函数来表示加载完成。

我正在使用require(["module"], callback(module), callback(error))异步加载模块(关于彼此)。

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

我可以在谷歌Chrome开发人员工具控制台看到错误,但错误返回没有被调用:

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错误的经验?如果有,怎么做?

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

我正在使用的库(它们都没有被缩小):

  • RequireJS 1.0.8
  • 强调1.6.0
  • jQuery 1.11.0
  • 骨干1.1.2
  • 骨干。SubRoute 0.4.1

在上面的库中,目前只有RequireJS和Underscore被我直接使用。

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

我将在这里发布我的bootstrap.jsApplication.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); 
    }
);

Application.js

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
    };
});

表明您正在使用RequireJS 1.0.8。我已经检查了1的文档。X系列,找不到任何关于错误的信息。这个页面实际上表明,错误返回是在2。x系列。

另外,shim是在2中引入的。x系列。所以现在,RequireJS忽略了你的shims