簡単な例を使用して、RevealingModulePatternとjQueryDeferredsを理解しようとしています。
私がしたいのは、モジュールを呼び出してユーザーの場所を取得し、その呼び出しが成功した場合は、Googleマップに場所を表示することです。
たくさんの関数とコールバックを使用するこれらの操作はどちらも私にとっては問題ありませんが、「スパゲッティ」ではなく「ラビオリ」のような方法でそれを実行しようとしました。
私が見つけたのは、deferredが完全に機能している間、モジュールのパブリックプロパティには、場所を取得するための操作中に設定した値が含まれていないということです。
これは私の「geoModule」です
var geoModule = function () {
var lat;
var lng;
var init = function () {
return $.Deferred(function (def) {
getCurrentPositionDeferred({})
.fail(function () { def.reject(); })
.done(function (location) {
lat = location.coords.latitude;
lng = location.coords.longitude;
logger.log("Got location : " + lat + " : " + lng);
def.resolve();
});
}).promise();
};
var getCurrentPositionDeferred = function(options) {
var deferred = $.Deferred();
navigator.geolocation.getCurrentPosition(deferred.resolve, deferred.reject, options);
return deferred.promise();
};
return { lat: lat, lng: lng, init: init };
}();
これが私の「mapModule」です
var mapModule = function (mapId) {
var mapElement = document.getElementById(mapId);
var map;
var initMap = function (lat, lng) {
logger.log("init map: " +lat + " : " + lng);
var myOptions = {
zoom: 14,
center: new google.maps.LatLng(lat, lng),
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(mapElement, myOptions);
};
return { initMap: initMap };
}('map');
私がこれらをこのようにまとめると:
$.when(geoModule.init())
.done(function () {
logger.log("location done " + geoModule.lat + " : " + geoModule.lng);
mapModule.initMap(geoModule.lat, geoModule.lng);
});
geoModule.latとgeoModule.lngは未定義ですが、geoLocationにそれらを設定するコードは正常に実行されています。
http://jsfiddle.net/faG4J/4/で、ロギング出力を示す完全な例を作成しました。私はおそらく本当に愚かなことをしているので、どんな助けでも大歓迎です。