Google maps 使用AMD动态加载google.maps的更干净的方法是什么?

Google maps 使用AMD动态加载google.maps的更干净的方法是什么?,google-maps,dojo,js-amd,Google Maps,Dojo,Js Amd,我想利用google maps loader回调,如下所示: 我有一个使用AMD和promises实现这一点的工作示例。要加载和使用API,请执行以下操作: require(["path/to/google-maps-api-v3"], function (api) { api.then(function (googleMaps) { // consume the api }); }); 这是我的模块def,我希望在它完全加载后返回google.maps,而不是延迟返回:

我想利用google maps loader回调,如下所示:

我有一个使用AMD和promises实现这一点的工作示例。要加载和使用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模块,但不知道如何创建一个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"]);

创建一个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"]);

解决方案似乎是创建一个插件:例如,是的,在我开始阅读你的评论之前,我想用“AMD插件”作为答案。编写AMD插件可以让您控制模块何时解析,同时仍然能够像其他AMD模块依赖项一样直接加载。解决方案似乎是创建一个插件:例如,是的,在我开始阅读您的评论之前,我认为“AMD插件”是答案。编写一个AMD插件可以让你控制模块何时解析,同时仍然能够像其他AMD模块依赖一样直接加载。是的,只需稍加调整<代码>加载回调(google.maps)我一直在使用这种方法,现在我们发现自己在中国的用户中谷歌被屏蔽了。我发现这很有帮助,为require错误事件设置一个处理程序并自己调用
loadCallback(false)
,然后调用require的代码可以优雅地处理失败。是的,只需稍加调整<代码>加载回调(google.maps)我一直在使用这种方法,现在我们发现自己在中国的用户中谷歌被屏蔽了。我发现这很有帮助,为require错误事件设置一个处理程序并自己调用
loadCallback(false)
,然后调用require的代码可以优雅地处理失败。