0

我遇到了问题,我无法在这段代码中创建循环:

    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

这两个警报用于调试。它只显示我一次:“开始”,紧跟在“结束”之后,没有别的。
我得出结论,最后一行是错误的,我需要找到一种方法来调用 Ajax 中的方法。
我试图用甚至替换setTimeout "waitformsg()", 0this.waitformsg()waitformsg()它仍然不起作用。

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

4

2 回答 2

1

这两个:

waitformsg()
setTimeout waitformsg, 0

将不起作用,因为waitformsg范围内没有功能。

这:

setTimeout "waitformsg()", 0

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

您应该使用粗箭头 ( =>)将回调绑定到当前上下文:

waitformsg: =>
  alert 'begin'
  $.ajax
    #...
    error: (XMLHttpRequest, textStatus, errorThrown) =>
      alert "end"
      @waitformsg()

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

setTimeout @waitformsg, 1000

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

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

  1. @在 CoffeeScript 中 using 比 using 更惯用,因此this您的构造函数应该是:

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

于 2012-08-27T17:54:32.617 回答
0

我没怎么玩过 CoffeeScript,所以这里是你在 Javascript 中的做法:

waitformsg: function() {
    var self = this;

    ...
    ...

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

当你简单地打电话时waitformsg(),你基本上是在打电话window.waitformsg()。由于这不存在,因此您的代码不起作用。你不能使用this,因为回调是异步的,所以当回调被调用时,它的值this几乎是 jQuery 设置的(如果它设置的话) 。error因此,您还需要维护对this传递给关闭的引用,您可以通过在函数的本地范围内创建一个新变量并分配this给该变量来做到这一点(在这种情况下,我称之为 new变量self)。然后就可以调用了self.waitformsg();

于 2012-08-27T16:08:50.400 回答