Что является более чистым способом динамической загрузки google.maps с использованием AMD?
Я хочу воспользоваться функцией обратного вызова загрузчика карт Google, как показано здесь: 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 ответ
Решение
Создайте плагин 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"]);