Javascript 未调用RequireJS错误回调(errback)
我正在使用RequireJS编写一个模块化web应用程序,用于模块加载和依赖项注入 从我的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状态代码时),不会调
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页面“最新”版本和更新库。我已更新