在Coffeescript中进行Ajax投票 - 什么是超出范围,为什么?

时间:2015-05-27 17:50:35

标签: javascript jquery coffeescript polling

我想重新加载一个iframe,当生成预览时所需的图像会被后台工作人员缓存(可能需要一段时间。)

class Preview
  constructor: (preview) ->
    @preview = preview
    @loadWhenCachedPoll() unless @preview.data?.footprintsCached?

  loadWhenCachedPoll: ->
    @interval = null
    @interval = setInterval(@loadWhenCached(), 3000)

  loadWhenCached: ->
    console.log "polling"
    $.ajax(
      url: "/user_image_caches/cached",
      method: "GET"
      dataType: "JSON"
      success: (data) =>
        if data["cached"] == "true"
          clearInterval(@interval)
          @preview.data.footprintsCached.val("true")
          @preview.attr('src', '/certificate.pdf')
    )

jQuery ->
  new Preview $("[data-behavior='preview']")

它第一次成功运行,然后每次我得到 Uncaught SyntaxError: Unexpected identifier

表明某些事情超出了范围。

2 个答案:

答案 0 :(得分:0)

我粗略猜测你会失去你的#34;这个" setInterval中的绑定,因为setInterval出现在窗口上。我抛出一个console.log来检查' this',或者在setInterval内的匿名函数中绑定/包装@ loadWhenCached()。我有一段时间没有和coffeescript合作,所以也许' @'解释了这一点。

答案 1 :(得分:0)

您有两个错误:

  1. 您使用setInterval的返回值而不是loadWhenCached函数本身来调用loadWhenCached
  2. loadWhenCached不受任何限制,因此当this调用它时,setInterval将不会是您所期望的。
  3. 第一个很容易修复,传递函数引用而不是调用函数:

    setInterval(@loadWhenCached, 3000) # No function-calling parentheses
    

    您的版本正在调用loadWhenCached,而setInterval的参数列表正在构建,而不是由setInterval调用。

    第二种可以通过各种方式修复。您可以使用fat-arrow

    使loadWhenCached绑定方法
    loadWhenCached: =>
      #...
    

    或者您可以在调用setInterval时使用Function.prototype.bind绑定它:

    setInterval(@loadWhenCached.bind(@), 3000)