调用Ajax内部的函数

Call a function inside Ajax

本文关键字:函数 内部 Ajax 调用      更新时间:2023-09-26

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

    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,但仍然不起作用。

我想显示无限的"警报",直到收集到成功的合适条件。

这两个:

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中使用@比使用this更惯用,因此您的构造函数应该是:

    constructor: ->
      @waitformsg()
    
  2. jQuery针对$.ajaxasync:true标志已经被弃用,所以你应该停止使用它。async:true对你的用户来说也是一件令人讨厌的事情(尤其是在循环中),所以你也应该停止使用。

我没有玩过太多CoffeeScript,所以下面是如何在Javascript中做到这一点:

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

当你简单地呼叫waitformsg()时,你基本上就是在呼叫window.waitformsg()。由于这不存在,您的代码就无法工作。您不能使用this,因为回调是异步的,因此this的值几乎是调用error回调时jQuery将其设置为的值(如果它设置了它的话)。因此,您需要维护一个对this的引用,该引用也会传递到闭包中,您可以通过在函数的本地范围中创建一个新变量并将this分配给该变量来实现这一点(在本例中,我将该新变量称为self)。然后您可以拨打self.waitformsg();