javascript - Getting around asynchronous ajax get -
so have function -
    ipgeocoding = (data) ->     coords = []     finish = _.after(data.length, (coords) ->       console.log coords       return coords     )     _.each(data, (datum) ->         $.ajax(           url: "http://freegeoip.net/json/#{datum}"           type: 'get'           success: (result) ->             lat = result.latitude             lon = result.longitude             pair = [lat, lon]             coords.push(pair)             finish(coords)         )     ) it's being called
if @model.get('data')?   if @model.get('func')?     @points = @model.get('func')(@model.get('data')) however, @points undefined. want @points coords when console.log coords run(which array of length). i'm using _.after because want build coords results of multipl async calls.
how coordinates in coords?
you've left out callback parameter ipgeocoding the other answer. you're supposed doing this:
ipgeocoding = (data, callback) ->   finish = _.after(data.length, callback)   #... and you'd use like:
ipgeocoding(data, (coords) ->   # whatever needs done `coords`   # in here. ) from fine manual:
after
_.after(count, function)creates version of function run after first being called count times. useful grouping asynchronous responses, want sure async calls have finished, before proceeding.
so finish call won't until $.ajax calls have returned , callback called final coords.
also note there's no guarantee order of coords match order of data. if need maintain order you'll need build object in coords instead of array , re-order things @ end. assuming datum simple scalar this:
coords = { } finish = _.after(data.length, (coords) ->   in_order = (coords[datum] datum in data)   callback(in_order) ) and in success handler you'd coords[datum] = pair instead of coords.push(pair).