массив объектов javascript - PullRequest
       3

массив объектов javascript

0 голосов
/ 03 сентября 2011

Я успешно создаю объекты из некоторого XML. Затем я пытаюсь поместить каждый новый объект в новый индекс массива, который в конечном итоге будет содержать все объекты.

Однако массив продолжает возвращаться как пустой. Мой код выглядит следующим образом:

var $locations  =   [];
            /*$obj  =   {};
            $obj['test']    =   'working';
            $locations.push($obj);*/

            $.ajax({
                type:       "POST",
                url:        "/locations/845/data.xml",
                dataType:   "xml",
                success:    function($xml){

                    $($xml).find('node').each(
                        function(){
                            $location   =   {};
                            //alert( $(this).attr('Latitude') );
                            $location['latitude']   =   $(this).attr('Latitude');
                            $location['longitude']  =   $(this).attr('Longitude');
                            $location['city']       =   $(this).attr('City');
                            $location['street']     =   $(this).attr('Street');

                            //alert( $location.toSource() );
                            //alert( $location['latitude'] );
                            $locations.push($location);
                        }
                    );
                }
            });
            alert( $locations.toSource() );

Закомментированный объект, созданный и вставленный в массив $ location, является тестом, и он работает. Но фактический полезный код в функции успеха ajax этого не делает.

Может кто-нибудь помочь?

1 Ответ

4 голосов
/ 03 сентября 2011

Ваш ajax-вызов асинхронный.Когда вы вызываете его, он просто запускает его выполнение, а остальная часть вашего кода продолжает выполняться.Ajax еще не завершен, когда срабатывает ваше оповещение, и он не завершен, пока не будет вызвана функция обработчика успеха.Единственное место, где вы можете знать, что вызов ajax завершен, находится в самом обработчике успеха.Фактически все, что вы хотите сделать с возвращаемыми данными ajax, должно инициироваться из обработчика успеха, а не из кода, который выполняется после того, как вы вызвали вызов ajax.

Если вы переместите строку:

alert( $locations.toSource() );

до конца функции обработчика успеха, тогда вы увидите ваши данные.Только тогда вызов ajax фактически завершен.

Попробуйте это так:

        var $locations  =   [];
        /*$obj  =   {};
        $obj['test']    =   'working';
        $locations.push($obj);*/

        $.ajax({
            type:       "POST",
            url:        "/locations/845/data.xml",
            dataType:   "xml",
            success:    function($xml){

                $($xml).find('node').each(
                    function(){
                        $location   =   {};
                        //alert( $(this).attr('Latitude') );
                        $location['latitude']   =   $(this).attr('Latitude');
                        $location['longitude']  =   $(this).attr('Longitude');
                        $location['city']       =   $(this).attr('City');
                        $location['street']     =   $(this).attr('Street');

                        //alert( $location.toSource() );
                        //alert( $location['latitude'] );
                        $locations.push($location);
                    }
                );
                alert( $locations.toSource() );
            }
        });
...