所以我有这个功能 -
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)
)
)
它被称为这样
if @model.get('data')?
if @model.get('func')?
@points = @model.get('func')(@model.get('data'))
然而,@ points未定义。我希望@points成为运行console.log coords时的coords(这是一个有一定长度的数组)。我正在使用_.after因为我想从multipl异步调用的结果中建立coords。
如何让坐标成为坐标?
答案 0 :(得分:0)
您已将callback
参数从the other answer遗漏到IPGeocoding
。你应该这样做:
IPGeocoding = (data, callback) ->
finish = _.after(data.length, callback)
#...
然后你就像使用它一样:
IPGeocoding(data, (coords) ->
# Do whatever needs to be done with `coords`
# in here.
)
来自fine manual:
在_.after(count, function)
之后
创建一个仅在首次被称为 count 次之后才会运行的函数版本。在继续之前,您可以对异步响应进行分组,以确保所有异步调用都已完成。
因此,finish
调用在成功返回所有$.ajax
个调用后才会执行任何操作,然后将使用最终callback
调用coords
。
另请注意,我们无法保证coords
的顺序与data
的顺序相匹配。如果你需要维护订单,那么你需要在coords
而不是数组中构建一个对象,然后在最后重新排序。假设datum
是一个简单的标量,你可以这样做:
coords = { }
finish = _.after(data.length, (coords) ->
in_order = (coords[datum] for datum in data)
callback(in_order)
)
然后在success
处理程序中,您要说coords[datum] = pair
而不是coords.push(pair)
。