7

I've been trying to get the push() method on a loop to build a structure as follows:

var locations2 = [
    ['User', position.coords.latitude, position.coords.longitude, 1],
    ['Bondi Beach', -33.890542, 151.274856, 2],
    ['Coogee Beach', -33.923036, 151.259052, 3],
    ['Cronulla Beach', -34.028249, 151.157507, 4],
    ['Manly Beach', -33.80010128657071, 151.28747820854187, 5],
    ['Maroubra Beach', -33.950198, 151.259302, 6]
];

This is my code:

var locations = [];

$.ajax({
    type: "POST",
    url: "/ajax/map.php",
    data: "name=test",
    dataType: "json",
    cache: false,
    success: function(data){
        $.each(data.points, function(i,item){
            array_push = ["test", parseFloat(item.origem_lat), parseFloat(item.origem_lng), i];
            locations.push(array_push);
        });               
    }
});  

However, the Javascript console.log for locations shows an empty array.

I have tried to use push() in many different ways, but I cannot get the same structure as locations2. The biggest problem here is that I do not know how many arrays are going to be inside the locations array before the loop, so I can't initialize it beforehand.

Any thoughts?

10
  • 1
    Your syntax looks right -- are you sure data.points contains the array you're expecting? Commented Dec 12, 2012 at 0:54
  • 1
    Add an error callback to your ajax call. It may be throws an error but you may not know with this code. Commented Dec 12, 2012 at 0:56
  • You can do a quick dump of your array contents with alert( JSON.stringify(x) ) where x is the array in question. Commented Dec 12, 2012 at 0:56
  • 5
    Do not forget to put the console.log statement in the callback, otherwise it won't be populated yet. Commented Dec 12, 2012 at 0:57
  • 1
    please post your result json to validate! Commented Dec 12, 2012 at 7:59

1 Answer 1

4

I figured out what the problem is. It has nothing to do with the push() method itself. Apparently ajax calls are not executed in sequential order (that's the reason it's asynchronous). I added async: false in the ajax call options and now everything works perfectly.

Thanks everyone for the input.

2
  • 4
    async: false defeats the whole purpose of using Asynchronous JavaScript and XML. You'll run into problems like page hangs etc because your requests are now blocking. Maybe look into Deferred Objects api.jquery.com/category/deferred-object Commented Dec 13, 2012 at 0:50
  • +1 for mentioning deferreds. Its worth mentioning that there's a little bit of a learning curve, but they aren't too bad at all and are well suited for situations like these. Commented Jan 9, 2013 at 22:33

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.