2014-08-29 6 views
0

Мне было интересно, если есть способ получить jQuery Deferred, работающий с Google Geocoder. Я пытался что-то вроде:Google Geocoder и jQuery Deferred

// ... 

_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 Отложенный объект, так что этот код не будет работать, как ожидалось. Есть ли другой способ сделать это? Я тоже не уверен в 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); 
}); 
Смежные вопросы