2014-09-29 39 views
11
Ben JavaScript/jQuery bir işlevden bir dizi dönmek gerek ama dizi ayarlanmış önce (o bir AJAX çağrısı gibi) işlevini veriyor

bir söz ekleme.bir Google Maps API çağrısı

bir söz kullanmaları tavsiye edilmiştir ama daha önce bu kullanmadıysanız ve şimdiye kadar benim koduna bu uygulamaya geçiremedi. Gördüğünüz gibi ben olduğunu döndüğünüzde

mapClass.setLatLng = function(location, clubs) {   
     document.geoCodeRequestCompleteFlag = 0; 
     geocoder = new google.maps.Geocoder();  
     geocoder.geocode({'address' : location}, function(results, status) {  
      //console.log(results); 
      if(status === "OK") {     
       var latLngArray = []; 
       latLngArray.push(parseFloat(results[0].geometry.location.lat())); 
       latLngArray.push(parseFloat(results[0].geometry.location.lng())); 
       var sortedArray = mapClass.calculateDistances(clubs, latLngArray); 
       return sortedArray; 
      }   
     });    
    } 

, sortedArray değişken boş: İşte benim kodudur. Dizi değişkenlerinin geri dönmeden önce ayarlandığından emin olmak için engelleme kodunu nasıl ekleyebileceğime dair herhangi bir fikri olan var mı? Teşekkür

cevap

15

sözler kullanmak yolu bir söz oluşturup ardından yönteminden bu sözü iade olmasıdır. Bu söz sözdür (bir değer verilir) çözüme olduğunda yürütmek işlevlerini belirtmek sağlayacak .then(successHandler, errorHandler) gibi yöntemler vardır. Gelecekte bir noktada coğrafi kod çağrısı sonucunu geri aldığınızda söz verdiğiniz yanıtı çözersiniz. jQuery yılında

, sözler Deferreds denir.

Kodunuz sonra böyle bir şey değiştirecek:

mapClass.setLatLng = function(location, clubs) { 
     var deferred = $.Deferred(), 
      geocoder = new google.maps.Geocoder(); 

     document.geoCodeRequestCompleteFlag = 0; 
     geocoder.geocode({'address' : location}, function(results, status) {  

     if (status === 'OK') {     
      var latLngArray = [ 
       +results[0].geometry.location.lat(), 
       +results[0].geometry.location.lng() 
      ]; 

      deferred.resolve(mapClass.calculateDistances(clubs, latLngArray)); 
     } else { 
      deferred.reject(status); 
     }   
    });    

    return deferred.promise(); 
} 

Öyle gibi kullanabilirsiniz olacaktır:

mapClass.setLatLng('123 Some St, Wherever', [/* clubs */]) 
.then(function (sortedArray) { 
    console.log('Promise resolved with: ', sortedArray); 
}, function (err) { 
    console.error('Uh oh! An error occurred!', err); 
}); 
+0

Fantastik cevap ve açıklama. Teşekkür ederim. – devoncrazylegs

12

Eğer resmi Google Maps Official NPM module kullanıyorsanız, Yapabilirsin çok daha kolay ve temizleyici.

Sonra
const googleMapsClient = require('@google/maps').createClient({ 
    key: 'your API key here', 
    Promise: Promise 
}); 

, yapmanız gereken tek şey asPromised() kullanımı ve bundan sonra gitmek iyidir:

Önce, bir Promise özelliğiyle müşteri ilklendirmelisiniz

googleMapsClient.geocode({ 
    address: '1600 Amphitheatre Parkway, Mountain View, CA' 
}) 
.asPromise() 
.then(response => response.json.results) 
.catch(err => console.log(err)) 
+0

Sözlü çeviri desteği için herhangi bir belge var mı? * Bu NPM modülü sunucu tarafı API istekleri için tasarlanmıştır ve sadece * Sunucu anahtarı ile çalışır - ben bu kendim yapmaya çalışıyorum ve bir tepki olsa dikkatli olun – Stormie

+0

döndürmez. XHR istekleri için tasarlanmamıştır. –