0

所以我有这个功能 -

    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 是因为我想从多重异步调用的结果中建立坐标。

如何让坐标处于坐标中?

4

1 回答 1

0

您已经从另一个 answer中省略了callback参数 to 。你应该这样做:IPGeocoding

IPGeocoding = (data, callback) ->
  finish = _.after(data.length, callback)
  #...

然后你会像这样使用它:

IPGeocoding(data, (coords) ->
  # Do whatever needs to be done with `coords`
  # in here.
)

来自精美手册

_.after(count, function)

创建仅在第一次调用count次后才运行的函数版本。对于分组异步响应很有用,您希望在继续之前确保所有异步调用都已完成。

因此,在finish所有调用成功返回之前,调用不会执行任何操作$.ajax,然后callback将使用 final 调用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).

于 2013-08-19T04:31:26.910 回答