【问题标题】:What is a cleaner way to dynamically load google.maps using AMD?使用 AMD 动态加载 google.maps 的更简洁的方法是什么?
【发布时间】:2013-11-13 14:26:02
【问题描述】:

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

我有一个使用 AMD 和 Promise 的工作示例。加载和使用 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 模块,但不知道如何。

【问题讨论】:

  • 解决方案似乎是创建一个插件:例如gist.github.com/JanMisker/3884283
  • 是的,在我开始阅读您的评论之前,我一直在想“AMD 插件”作为答案。编写 AMD 插件可以让您控制模块何时解析,同时仍然能够像任何其他 AMD 模块依赖项一样直接加载它。

标签: google-maps dojo js-amd


【解决方案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"]);

【讨论】:

  • 是的,稍作调整。 loadCallback(google.maps);
  • 我一直在使用这种方法,现在我们发现自己在中国遇到了谷歌被屏蔽的用户。我发现stackoverflow.com/questions/10449207/… 很有帮助,为 require 错误事件设置一个处理程序并自己调用loadCallback(false),然后调用 require 的代码可以优雅地处理失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多