2014-08-29 41 views
0

我想知道,如果有一種方法可以讓jQuery延遲與谷歌地理編碼器一起工作。我想是這樣的:谷歌地理編碼器和jQuery推遲

// ... 

_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"); 
     } 
    ); 
}, 


// ... 

然而google.maps.Geocoder不返回一個jQuery Deferred對象,從而有望這段代碼將無法正常工作。有沒有其他方法可以做到這一點? 我也不確定return deferred.promise();,因爲我看了一些代碼示例,其中只使用了return deferred;。有什麼區別嗎?

回答

6

我會做這樣的事情:

// ... 
_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(); 
}, 
// ... 

注:通過解決延遲與整個results[0]對象,更多的潛在可用數據可向下的承諾鏈。見API Reference

測試如下:

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