1

簡単な例を使用して、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/で、ロギング出力を示す完全な例を作成しました。私はおそらく本当に愚かなことをしているので、どんな助けでも大歓迎です。

4

1 に答える 1

1

設定した変数はモジュールのプロパティではなく、単なるローカル変数です。それらの値をモジュール オブジェクトにエクスポートしましたが、一度に設定されていませんでした。

ただし、これはまったく行うべき方法ではありません。設定されるオブジェクトの一部のプロパティについては約束しないでください。ただし、これらの値については約束してください。

機能が 1 つしかないモジュールは役に立たないように思えるので、ここでは省略しました。

function getPosition() {
    var deferred = $.Deferred();
    navigator.geolocation.getCurrentPosition(deferred.resolve, deferred.reject);
    // pipe the output of the deferred through this logging and transformation function
    return deferred.then(function (location) {
        var lat = location.coords.latitude;
        var lng = location.coords.longitude;
        logger.log("Got location : " + lat + " : " + lng);
        return {lat: lat, lng: lng};
    });
}

次に、のようなものを使用しますgetPosition.done(createMap)

于 2012-11-25T18:32:59.930 に答える