2013-08-20 50 views
6

我正在编写一个使用require.js作为我的加载框架的移动混合应用程序。我遇到加载错误的问题。我试图做的是设置一个备用解决方案,当设备处于脱机状态时,我无法下载我需要在屏幕上显示地图的Google地图API脚本。我得到的全部是如何处理requireJs超时错误?

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:

原谅我,这不是与此代码的工作。它总是回退到替代实现,因为gmaps需要使用异步插件才能完全加载,并且我无法使其与插件一起工作。

+0

不管你做什么,绝对去协议相对URL(以//开头),所以你不会遇到http和https的问题。这些问题是浏览器特定的,用户可能会看到警告或JS文件根本不会加载。 例如:http://cdnjs.com/ – nekaab

+0

谢谢,我终于明白了为什么现在使用这种类型的网址! – sangaran

+0

我也有这个问题,如果有的话,超时错误在哪里?我无法在本地或全局错误处理程序中捕获它。 这是谷歌分析导致我的问题,如果超时我只是想继续加载模块。 –

回答

2

你可以尝试以下方法:

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); 
}); 
+0

我编辑了我的答案,包括基于此的解决方案,或多或少。 – sangaran

0

的RequireJS文档有a section on errors将覆盖你的具体情况。

详细信息falling back to a local copy of jQuery如果CDN不可用。

+0

这不一样。我不想取代gmaps实现。我想让我的一个模块依赖于gmaps,但如果gmaps不是真正的模块,它应该改变它的行为。可能吗? – sangaran

6

您可以通过捕获错误:

requirejs.onError = function (err) { 
    if (err.requireType === 'timeout') { 
     alert("error: "+err); 
    } 
    else { 
     throw err; 
    } 
}; 

希望这有助于!

1

我相信你原来的问题从未解决过你想要的东西,而我们遇到了同样的问题。基本上,我们希望有一种方法可以在谷歌地图超时或不可用时正常恢复,因为有时我们的应用程序将在用户的机器上运行,并且他们无法访问互联网。

我最初使用的是异步!其他人使用的插件,但无法提供允许我需要的错误处理的修改。

因此,我写了我自己的工具类,它在requireJS容器外异步加载谷歌地图,并提供错误回调处理。看看它是否能解决你的问题。对于我们来说,它允许我们在maps.google时向用户呈现一个很好的警告视图。COM无法达成,而应用程序的其余仍在正常加载:

https://github.com/mag382/googleMapsLoaderUtil

2

我有同样的问题,我在这个片段中解决它:

require(['async!http://maps.google.com/maps/api/js?sensor=false'], function() { 
    //Success processing 
}, function (e) { 
    //Error processing 
});