在Ajax中调用一个函数

时间:2012-08-27 16:00:55

标签: 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: true
          cache: false
          timeout: 1000
          success: (data) ->
            alert data
          error: (XMLHttpRequest, textStatus, errorThrown) ->
            alert "end"
            waitformsg()setTimeout "waitformsg()", 0

两个arlerts用于调试。它只显示我一次:“开始”,紧接着“结束”之后没有别的。
我得出结论,最后一行是错误的,我需要找到一种在Ajax中调用方法的方法 我试图将setTimeout "waitformsg()", 0替换为this.waitformsg()甚至waitformsg(),但它仍然无效。

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

2 个答案:

答案 0 :(得分:1)

这两个:

waitformsg()
setTimeout waitformsg, 0

不起作用,因为范围内没有waitformsg函数。

此:

setTimeout "waitformsg()", 0

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

您应该使用fat arrow (=>)

将回调绑定到当前上下文
waitformsg: =>
  alert 'begin'
  $.ajax
    #...
    error: (XMLHttpRequest, textStatus, errorThrown) =>
      alert "end"
      @waitformsg()

如果您希望错误处理程序在再次尝试之前等待一秒钟:

setTimeout @waitformsg, 1000

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

我在这里时还有几件事情:

  1. 使用@在CoffeeScript中比使用this更惯用,所以你的构造函数应该是:

    constructor: ->
      @waitformsg()
    
  2. jQuery的$.ajax async:true标记已被弃用,因此您应该停止使用它。 async:true对用户来说也是一件令人讨厌的事情(特别是在循环中),所以你应该再次停止使用它。

答案 1 :(得分:0)

我还没有玩过很多咖啡,所以你可以在Javascript中做到这一点:

waitformsg: function() {
    var self = this;

    ...
    ...

    error: function(XMLHttpRequest, textStatus, errorThrown) {
        self.waitformsg();
    };
};

当您只是致电waitformsg()时,您基本上会打电话给window.waitformsg()。由于这不存在,您的代码无法正常工作。你不能使用this,因为回调是异步的,所以this的值几乎就是jQuery在调用error回调时设置的值(如果它设置的话) 。所以你需要维护一个传递给关闭的this的引用,你可以通过在函数的局部范围内创建一个新变量并为该变量赋值this来实现这一点(在这种情况下,我称之为新变量self)。然后你可以拨打self.waitformsg();