簡體   English   中英

在Ajax內部調用一個函數

[英]Call a function inside Ajax

我遇到問題,無法在此代碼內循環:

    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中調用方法的方法。
我試圖用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的$.ajax標志async:true已被棄用,因此您應該停止使用它。 對於用戶(尤其是在循環中), async:true也是一件令人討厭的事情,因此,再次,您應該停止使用它。

我沒怎么玩CoffeeScript,所以這是您在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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM