什么是使用AMD动态加载google.maps的更简洁方法?

时间:2013-11-13 14:26:03

标签: google-maps dojo js-amd

我想利用谷歌地图加载器回调,如下所示: https://developers.google.com/maps/documentation/javascript/examples/map-simple-async

我有一个使用AMD和承诺这样做的工作示例。加载和使用API​​:

require(["path/to/google-maps-api-v3"], function (api) {
  api.then(function (googleMaps) {
    // consume the api
   });
});

这是我的模块def,我更喜欢在完全加载而不是延迟后返回google.maps:

define(["dojo/Deferred"], function (Deferred) {
        var d = new Deferred();
        dojoConfig["googleMapsReady"] = function () {
            delete dojoConfig["googleMapsReady"];
            d.resolve(google.maps);
        }
        require(["http://maps.google.com/maps/api/js?v=3&sensor=false&callback=dojoConfig.ipsx.config.googleMapsReady&"]);
        return d;
    });

但是解决方案会返回一个承诺,而不是完全初始化的google.maps。我更喜欢它看起来像普通的AMD模块,但看不出如何。

1 个答案:

答案 0 :(得分:1)

创建一个AMD插件。这是我根据JanMisker的例子创建的那个:

define(function () {
    var cb ="_asyncApiLoaderCallback";
    return {
        load: function (param, req, loadCallback) {
            if (!cb) return;
            dojoConfig[cb] = function () {
                delete dojoConfig[cb];
                cb = null;
                loadCallback(google.maps);
            }
            require([param + "&callback=dojoConfig." + cb]);
        }
    };
});

用法示例:

require(["plugins/async!//maps.google.com/maps/api/js?v=3&sensor=false"]);