绕过异步ajax get

时间:2013-08-19 03:58:53

标签: javascript coffeescript

所以我有这个功能 -

    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。

如何让坐标成为坐标?

1 个答案:

答案 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)