37

私は場所を取得する関数を持っていますnavigator.geolocation:

var getLocation = function( callback ){

    navigator.geolocation.getCurrentPosition( callback || function( position ){

        // Stuff with geolocation

    });

};

jQuerys のDefferedオブジェクトを使ってこの関数を連鎖できるようにしたいのですが、まだ Deffered の概念と使い方を把握できていません。

この擬似コードに似たものを探しています:

getLocation().then(function(){
    drawMarkerOnMap();
});

この構文は、逆にひっくり返してコードに溺れることなく可能ですか?

4

3 に答える 3

66

新しい遅延オブジェクトをインスタンス化し、関数からそれ (またはその promise) を返す必要があります。.resolve応答を取得したら、そのメソッドを呼び出します。

var getLocation = function() {
    var deferred = new $.Deferred();

    navigator.geolocation.getCurrentPosition(function( position ){
        // Stuff with geolocation
        deferred.resolve(position);
    });

    // return promise so that outside code cannot reject/resolve the deferred
    return deferred.promise();
};

使用法:

getLocation().then(drawMarkerOnMap);

参考jQuery.Deferred


補遺:

インターフェイスをシンプルに保つために、遅延オブジェクトと関数へのコールバックの両方のアプローチを使用しないことをお勧めします。しかし、下位互換性を維持する必要がある場合は、渡されたコールバックを遅延オブジェクトに登録するだけです。

var getLocation = function(callback) {
    var deferred = new $.Deferred();

    if ($.isFunction(callback)) {
        deferred.then(callback);
    }

    navigator.geolocation.getCurrentPosition(function( position ){
        // Stuff with geolocation
        deferred.resolve(position);
    });

    // return promise so that outside code cannot reject/resolve the deferred
    return deferred.promise();
};
于 2013-01-17T10:50:52.830 に答える