我目前正在构建一个使用 google maps api v3 的小部件。它的设置过程如下所示:
- 注入 jQuery
- 注入html结构
- 注入 googlemaps api(仅加载 bootstrap .js 文件,该文件再次加载实际的 main.js)&& 加载地图数据
- 加载 googlemaps api 后立即设置基本地图
- 加载地图数据后立即将其应用到地图上(例如设置标记)
我的问题是我可以设置一个回调方法以在 google api 完成加载时触发。我想开始加载我的数据,一旦加载地图并且数据请求成功(或失败)应用数据。我正在使用jQuery 的 Deferred Object,代码看起来像这样:
主要部分:
jQuery.when(
fn.getData()
)
.then(function(resolvedArgs) {
gmap.setData(resolvedArgs['data']);
gmap.addMarkerOverlay();
})
.fail(function(jqXHR, textStatus) {
var message = textStatus + ': loading data';
fn.showInfoBox(message);
});
GoogleMaps 部分(同源策略解决方法,这是负责加载外部脚本的函数的基本返回):
return jQuery.Deferred(function(deferred) {
var scriptTag = document.createElement('script');
scriptTag['type'] = 'text/javascript';
scriptTag['src'] = 'googlemapsapiurl&callback=setupGoogleMap';
scriptTag['async'] = true;
document.getElementsByTagName("head")[0].appendChild(scriptTag);
scriptTag['onload'] = scriptTag['onreadystatechange'] = function() {
if (!this.readyState || this.readyState === "loaded" || this.readyState === 'complete') {
deferred.resolve();
}
};
}).promise();
第二个谷歌地图部分:
var setupGoogleMap = function() {
jQuery('.container').trigger('googleMapsReady');
};
和...
jQuery('.container').on('googleMapsReady', function(event) {
fn.setupGoogleMap();
});
我不知道将 google api 请求放在哪里,因为它是 google 端的一个两步加载过程。也许我可以阻止jQuery Deferred的默认成功resolve()调用并在google api回调方法中解决Deferred?有任何想法吗?