RequireJS错误回调(错误回调)未被调用

时间:2014-03-22 10:34:41

标签: javascript error-handling requirejs

我正在使用RequireJS编写模块化Web应用程序来进行模块加载和依赖注入。

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

我使用require(["module"], callback(module), callback(error))异步加载模块(相互关联)。

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

我可以在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.SubRoute

注册它们的路径

我使用的图书馆(没有一个是缩小的):

  • RequireJS 1.0.8
  • Underscore 1.6.0
  • jQuery 1.11.0
  • Backbone 1.1.2
  • Backbone.SubRoute 0.4.1

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

在将成功/失败回调传递给Require时,我使用了Underscore进行currying,以便将i作为index参数传入我的循环中。对于成功的回调,这非常有效,我认为这不会影响错误(我已经使用arity 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
    };
});

1 个答案:

答案 0 :(得分:5)

您表明您使用的是RequireJS 1.0.8。我已经检查了1.x系列的文档,但没有发现任何关于errbacks的信息。这个page实际上表明在2.x系列中引入了错误。

shim也是2.x系列中引入的内容。所以现在,RequireJS忽略了你的垫片。