我正在使用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和Underscore。
在将成功/失败回调传递给Require时,我使用了Underscore进行currying,以便将i
作为index
参数传入我的循环中。对于成功的回调,这非常有效,我认为这不会影响错误(我已经使用arity 1的简单函数进行了测试,而不是_.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);
}
);
的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
};
});
答案 0 :(得分:5)
您表明您使用的是RequireJS 1.0.8。我已经检查了1.x系列的文档,但没有发现任何关于errbacks的信息。这个page实际上表明在2.x系列中引入了错误。
shim
也是2.x系列中引入的内容。所以现在,RequireJS忽略了你的垫片。