【问题标题】:Callback on asynchronous request , passed variables get overwritten when I dont want them to异步请求回调,当我不希望传递的变量被覆盖时
【发布时间】:2013-07-13 02:56:41
【问题描述】:

我目前正在遍历一组位置对象。然后我打电话给谷歌,让我得到那个位置的全景图。问题是这个请求是异步的,所以当回调实际被调用时,我传递的位置变量是数组中的最后一个位置。

这里是示例代码和控制台日志输出:

  for location in paginated_data.locations
    console.log location
    latLng = new google.maps.LatLng(location.latitude,location.longitude)
    @sv.getPanoramaByLocation(latLng, 50, (StreetViewPanoramaData, StreetViewStatus) =>
      console.log location          
    )

如您所见,在初始循环中,控制台会看到正确的位置,在回调中,它只显示循环中的最后一个位置。谁能指出我如何解决这个问题的正确方向?

【问题讨论】:

  • 请发布您的回调,以及完整的功能。
  • 回调是一个匿名函数:(StreetViewPanoramaData, StreetViewStatus) => console.log location
  • getPanoramaByLocation 是一个 google api 函数,这就是为什么我无法控制传递给回调的变量的原因。默认情况下,谷歌调用返回 StreetViewPanoramaData、StreetViewStatus,但我还需要位置

标签: javascript asynchronous coffeescript


【解决方案1】:

更新:

您应该使用do 关键字让coffeescript 为每个循环迭代创建一个单独的闭包:

  for location in paginated_data.locations
    do (location) ->
      console.log location
      latLng = new google.maps.LatLng(location.latitude,location.longitude)
      @sv.getPanoramaByLocation(latLng, 50, (StreetViewPanoramaData, StreetViewStatus) =>
        console.log location

ORIGINAL(不那么咖啡,但仍以咖啡的方式):

您需要将代码包装在 iife 中,以便它有自己的范围并传入 location

  for location in paginated_data.locations
    ((location) ->
      console.log location
      latLng = new google.maps.LatLng(location.latitude,location.longitude)
      @sv.getPanoramaByLocation(latLng, 50, (StreetViewPanoramaData, StreetViewStatus) =>
        console.log location          
      )(location)

或将for 循环的主体移动到单独的function

  getLocation = (location) ->
    console.log location
    latLng = new google.maps.LatLng(location.latitude,location.longitude)
    @sv.getPanoramaByLocation(latLng, 50, (StreetViewPanoramaData, StreetViewStatus) =>
       console.log location

  for location in paginated_data.locations
    getLocation(location)
猜你喜欢
  • 1970-01-01
  • 2015-02-15
  • 2023-03-15
  • 1970-01-01
  • 2014-10-03
  • 2022-10-04
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
相关资源
最近更新 更多