Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Проблема с асинхронностью (https://javascript.ru/forum/jquery/21985-problema-s-asinkhronnostyu.html)

capscom 01.10.2011 23:50

Проблема с асинхронностью
 
Столкнулся с проблемой при написании плагина.

(function( $ ){

        var geocoder;
        var markers   = [];
     
        var methods = {
                init : function(options) {                                                    
                          ...                                            
                },
                      
                addMarker: function (marker){
                        
                        if (адрес координатами) {
                                markers.push(marker);
                        }        
                        else{
                                methods._geocoder(marker);   
                        }
                },
                               
                getMarker: function (id){
                        
                        .....
                  
                },               
                      
                _geocoder: function (marker) {
                                               
                        geocoder.geocode( {
                                'address': marker.position
                        }, function(results, status) {
                                if (status == google.maps.GeocoderStatus.OK) {
                                
                                        //вычислили координаты и добавляем маркер
                                        methods.addMarker(marker);

                                } 
                        });                               
                }
        
                       
        };

})( jQuery );



В функции _geocoder, используется геокодер гугла, для вычисления координат метки. Его вызов асинхронен. И возникает такая ситуация, если добавить несколько меток, вызвав метод addMarker, а потом возвратить их функцией getMarker, то получаем пустоту, потому что геокодер не успел отработать и метки не попали в массив markers.

Подскажите, пожалуйста. Как при вызове getMarker, узнать что геокодирование всех меток уже завершилось.

walik 02.10.2011 00:36

у функции геокодирования должны быть функция обратного вызова (callback), которая и вернет результат

capscom 02.10.2011 00:44

walik, результат чего? callback используется, вот же он:

function(results, status) {
           if (status == google.maps.GeocoderStatus.OK) {
                   methods.addMarker(marker);
	   }         
}


Часовой пояс GMT +3, время: 22:51.