Каков более чистый способ динамической загрузки google.maps с помощью AMD?

Я хочу воспользоваться функцией обратного вызова загрузчика карт Google, как показано здесь: https://developers.google.com/maps/documentation/javascript/examples/map-simple-async

У меня есть рабочий пример того, как это сделать с использованием 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, но не понимаю, как это сделать.


person Corey Alix    schedule 13.11.2013    source источник
comment
Кажется, что решения заключаются в создании плагина: например, gist.github.com/JanMisker/3884283   -  person Corey Alix    schedule 13.11.2013
comment
Да, я думал о подключаемом модуле AMD как ответ, прежде чем приступил к чтению вашего комментария. Написание подключаемого модуля AMD позволяет вам контролировать, когда модуль разрешается, сохраняя при этом возможность загружать его так же просто, как и любую другую зависимость модуля AMD.   -  person Ken Franqueiro    schedule 14.11.2013


Ответы (1)


Создайте плагин AMD. Вот тот, который я создал на примере Яна Мискера:

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"]);
person Corey Alix    schedule 14.11.2013
comment
Да, с небольшой поправкой. loadCallback(google.maps); - person Richard Ayotte; 06.08.2014
comment
Я использовал этот подход, теперь мы находимся с пользователями в Китае, для которых заблокирован Google. Я обнаружил stackoverflow.com/questions/10449207/, установите обработчик для события ошибки require и вызовите loadCallback(false) самостоятельно, тогда код, который вызвал require, сможет корректно обработать сбой. - person Neek; 20.09.2016