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)
.