Google Geocoder和jQuery Deferred

Dan*_*iel 0 jquery google-geocoder jquery-deferred

我想知道,如果有办法让jQuery Deferred使用Google Geocoder.我尝试过类似的东西:

// ...

_geocoder: function( address ) {
    if ( !this.props.geocoder ) {
        this.props.geocoder = new google.maps.Geocoder();
    }

    var deferred = $.Deferred(),
        geocoder;           

    geocoder = this.props.geocoder.geocode( { 'address': address }, function( results, status ) {
        if ( status === google.maps.GeocoderStatus.OK ) {
            deferred.resolve({
                lat: results[ 0 ].geometry.location.k,
                lng: results[ 0 ].geometry.location.A
            });
        } else {
            deferred.reject();
        }

        return deferred.promise();
    });

    $.when( geocoder() ).then(
        function( data ) {
            alert( status );
        },
        function() {
            alert( "Defer rejected" );
        }
    );
},


// ...
Run Code Online (Sandbox Code Playgroud)

但是google.maps.Geocoder,不返回jQuery Deferred对象,因此此代码将无法按预期工作.还有其他办法吗?我也不确定return deferred.promise();,因为我查看了一些刚才使用的代码示例return deferred;.有什么区别吗?

Roa*_*888 8

我会做这样的事情:

// ...
_geocoder: function(address) {
    var geocoder = this.props.geocoder;
    if (!geocoder) {
        geocoder = this.props.geocoder = new google.maps.Geocoder();
    }
    return $.Deferred(function(dfrd) {
        geocoder.geocode({'address': address}, function(results, status) {
            if(status === google.maps.GeocoderStatus.OK) {
                dfrd.resolve(results[0]);
            } else {
                dfrd.reject(new Error(status));
            }
        });
    }).promise();
},
// ...
Run Code Online (Sandbox Code Playgroud)

注意:通过使用整个results[0]对象解析Deferred,可以在promise链下面使用更多可能可用的数据.请参阅API参考

测试如下:

yourNamespace._geocoder('some address').then(function(result) {
    console.dir(result.geometry.location);
}, function(err) {
    console.error(err);
});
Run Code Online (Sandbox Code Playgroud)