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;.有什么区别吗?
我会做这样的事情:
// ...
_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)