Javascript 如何处理requireJs超时错误?
我正在使用require.js作为加载框架编写一个移动混合应用程序。我有一个加载错误的问题。我试图做的是在设备离线时设置一个后备解决方案,我无法下载在屏幕上显示地图所需的google maps API脚本。我得到的只是Javascript 如何处理requireJs超时错误?,javascript,requirejs,Javascript,Requirejs,我正在使用require.js作为加载框架编写一个移动混合应用程序。我有一个加载错误的问题。我试图做的是在设备离线时设置一个后备解决方案,我无法下载在屏幕上显示地图所需的google maps API脚本。我得到的只是 Uncaught Error: Load timeout for modules: async!http://maps.googleapis.com/maps/api/js?sensor=true 但我无法捕捉这个错误并提供一个替代实现。这是我的gmaps模块定义 define
Uncaught Error: Load timeout for modules: async!http://maps.googleapis.com/maps/api/js?sensor=true
但我无法捕捉这个错误并提供一个替代实现。这是我的gmaps模块定义
define('gmaps', ['async!http://maps.googleapis.com/maps/api/js?sensor=true'],function(){
return window.google.maps;
});
我能做什么
编辑
多亏了你的帮助,我设法找到了一个可能的解决办法。我从来没有这样做过
require.config({
paths: {
gmaps: ['http://maps.googleapis.com/maps/api/js?sensor=true', 'lib/dummymaps']
}
}
dummymaps只是一个简单的模块:
define({
dummy: true
});
然后在我的“家长”模块中,我会:
define(["gmaps"],function(gmaps){
...
if(typeof gmaps.dummy != 'undefined' && gmaps.dummy == true){
// use a local image as map
} else {
// initialize google maps canvas
}
});
你认为这是个好办法吗
编辑2:
请原谅,它不适用于此代码。它总是退回到替代实现,因为gmap需要使用异步插件才能完全加载,而我无法使它与插件一起工作。您可以尝试以下方法:
requirejs.config({
paths: {
// define an alias here, first try remote, if it fails it will try your local file
'gmaps': ['http://maps.googleapis.com/maps/api/js?sensor=true', 'your local file.js']
}
});
define('gmaps', function(gm) {
// var gm should now be the google maps plugin
console.log(gm);
});
RequireJS文档中包含了一些内容,这些内容将涵盖您的特定案例
如果CDN不可用,则提供详细信息 您可以通过以下方式捕获错误:
requirejs.onError = function (err) {
if (err.requireType === 'timeout') {
alert("error: "+err);
}
else {
throw err;
}
};
希望这有帮助 我相信你最初的问题从来没有按照你想要的方式得到解决,我们在这里遇到了同样的问题。基本上,我们想要一种在谷歌地图超时或不可用时优雅地恢复的方法,因为有时我们的应用程序会在用户无法访问互联网的机器上运行 我最初使用的是异步!其他所有人都使用的插件,但无法提供允许我所需的错误处理的修改 因此,我编写了自己的实用程序类,在requireJS容器外部异步加载google maps,并提供错误回调处理。看看它是否解决了你的问题。对于我们来说,它允许我们在无法访问maps.google.com时向用户呈现一个很好的警告视图,并且应用程序的其余部分仍然正常加载:
我也遇到了同样的问题,我用这个片段解决了这个问题:
require(['async!http://maps.google.com/maps/api/js?sensor=false'], function() {
//Success processing
}, function (e) {
//Error processing
});
不一样。我不想取代gmaps的实现。我想让我的一个模块依赖于GMAP,但如果GMAP不是真正的模块,那么模块应该改变它的行为。可能吗?理论上,您可以只重新加载模块,但IME requireJS在重试超时模块后不会运行依赖模块。我已经编辑了我的答案,或多或少地包含了基于此的解决方案。无论您做什么,一定要使用协议相关url(以//开头)因此,您不会遇到http和https问题。这些问题是特定于浏览器的,用户可能会看到警告,或者根本不会加载JS文件。谢谢,我终于明白为什么现在使用这种URL了!我也有这个问题,超时错误在哪里被捕获,如果有的话?我无法在本地或全局错误处理程序上捕获它。是google analytics导致了我的问题,如果超时,我只想继续加载模块。@Matt Derrick,我永远无法捕获超时错误并从中恢复。我能做的最多的就是记录错误。看看我发布的答案,看看这个实用程序库是否可以帮助您: