Javascript 绕过异步ajax获取
所以我有这个函数-Javascript 绕过异步ajax获取,javascript,coffeescript,Javascript,Coffeescript,所以我有这个函数- IPGeocoding = (data) -> coords = [] finish = _.after(data.length, (coords) -> console.log coords return coords ) _.each(data, (datum) -> $.ajax( url: "http://freegeoip.net/json/#{da
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是运行console.log coords时的coords(它是一个长度一定的数组)。我使用了u.after,因为我想从多个异步调用的结果中构建coords
如何获得坐标?您已将
回调
参数遗漏在IPGeocoding
中。你应该这样做:
IPGeocoding = (data, callback) ->
finish = _.after(data.length, callback)
#...
然后你会像这样使用它:
IPGeocoding(data, (coords) ->
# Do whatever needs to be done with `coords`
# in here.
)
从:
之后之后
创建函数的一个版本,该版本仅在第一次被调用count次后运行。用于对异步响应进行分组,您希望在继续之前确保所有异步调用都已完成
因此,finish
调用在所有$调用成功返回之前不会执行任何操作。然后,callback
将使用最后的coords
调用
还要注意,coords
的顺序不能保证与数据的顺序相匹配。如果需要维护顺序,则需要在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)
我不明白你想做什么@积分不是你的功能。那么,为什么它被定义与否很重要呢?我不知道你的前半部分代码与后半部分代码有什么关系?另外,我不知道您正在使用哪个框架,但是如果您试图检索coords
,那么get
必须支持异步模式。