Javascript 在Ajax中调用函数

Javascript 在Ajax中调用函数,javascript,ajax,coffeescript,long-polling,Javascript,Ajax,Coffeescript,Long Polling,我遇到了一个问题,我无法在此代码中进行循环: class ProductsPager constructor: -> this.waitformsg() waitformsg: => alert 'begin' $.ajax type: "GET" url: "http://0.0.0.0:3000/live/index.json" async:

我遇到了一个问题,我无法在此代码中进行循环:

    class ProductsPager
      constructor: ->
        this.waitformsg()
      waitformsg: =>
        alert 'begin'
        $.ajax
          type: "GET"
          url: "http://0.0.0.0:3000/live/index.json"
          async: true
          cache: false
          timeout: 1000
          success: (data) ->
            alert data
          error: (XMLHttpRequest, textStatus, errorThrown) ->
            alert "end"
            waitformsg()setTimeout "waitformsg()", 0
这两个Arlert用于调试。它只显示一次“开始”,在“结束”之后显示一次,没有其他内容。
我的结论是,最后一行是错误的,我需要找到一种在Ajax中调用方法的方法。
我试图用this.waitformsg()或甚至
waitformsg()
替换
setTimeout“waitformsg()”,0
,但它仍然不起作用


我想显示无限的“警报”,直到收集到成功的正确条件。

我很少使用CoffeeScript,下面是使用Javascript的方法:

waitformsg: function() {
    var self = this;

    ...
    ...

    error: function(XMLHttpRequest, textStatus, errorThrown) {
        self.waitformsg();
    };
};
只要调用
waitformsg()
,基本上就是调用
window.waitformsg()
。因为这不存在,所以您的代码无法工作。您不能使用
this
,因为回调是异步的,因此
this
的值与调用
error
回调时jQuery设置的值几乎相同(如果它设置了它)。因此,您需要维护一个对
this
的引用,该引用也会被传递到close中,您可以通过在函数的局部范围中创建一个新变量并将
this
赋值给该变量来实现这一点(在本例中,我将该新变量称为
self
)。然后可以调用
self.waitformsg()

这两个:

waitformsg()
setTimeout waitformsg, 0
无法工作,因为作用域中没有
waitformsg
函数

这:

无法工作,因为没有名为
waitformsg
的全局函数,的字符串形式在全局上下文中执行字符串。我建议您忘记
setTimeout
甚至还有字符串形式

应使用以下命令将回调绑定到当前上下文:

如果希望错误处理程序在重试前等待一秒钟:

setTimeout @waitformsg, 1000
waitformsg
方法将在正确的上下文中运行,因为您将其定义为绑定函数

我在这里的时候还有几件事:

  • 在CoffeeScript中使用
    @
    比使用
    更为惯用,因此您的构造函数应该是:

    constructor: ->
      @waitformsg()
    
  • jQuery的
    async:true
    标志已被弃用,因此您应该停止使用它
    async:true
    对用户来说也是一件令人讨厌的事情(尤其是在循环中),因此,您应该停止使用它

  • setTimeout @waitformsg, 1000
    
    constructor: ->
      @waitformsg()