Javascript 如何处理requireJs超时错误?

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

我正在使用require.js作为加载框架编写一个移动混合应用程序。我有一个加载错误的问题。我试图做的是在设备离线时设置一个后备解决方案,我无法下载在屏幕上显示地图所需的google maps API脚本。我得到的只是

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,我永远无法捕获超时错误并从中恢复。我能做的最多的就是记录错误。看看我发布的答案,看看这个实用程序库是否可以帮助您: