我想重新加载一个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
表明某些事情超出了范围。
答案 0 :(得分:0)
我粗略猜测你会失去你的#34;这个" setInterval中的绑定,因为setInterval出现在窗口上。我抛出一个console.log来检查' this',或者在setInterval内的匿名函数中绑定/包装@ loadWhenCached()。我有一段时间没有和coffeescript合作,所以也许' @'解释了这一点。
答案 1 :(得分:0)
您有两个错误:
setInterval
的返回值而不是loadWhenCached
函数本身来调用loadWhenCached
。loadWhenCached
不受任何限制,因此当this
调用它时,setInterval
将不会是您所期望的。第一个很容易修复,传递函数引用而不是调用函数:
setInterval(@loadWhenCached, 3000) # No function-calling parentheses
您的版本正在调用loadWhenCached
,而setInterval
的参数列表正在构建,而不是由setInterval
调用。
第二种可以通过各种方式修复。您可以使用fat-arrow
使loadWhenCached
绑定方法
loadWhenCached: =>
#...
或者您可以在调用setInterval
时使用Function.prototype.bind
绑定它:
setInterval(@loadWhenCached.bind(@), 3000)