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

2 つのアラートはデバッグ用です。「 begin 」と「 end 」の直後だけが表示され、それ以外は何も表示されません。
最後の行が間違っていると結論付けたので、Ajax 内でメソッドを呼び出す方法を見つける必要があります。またはでも
置き換えようとしましsetTimeout "waitformsg()", 0たが、それでも機能しません。 this.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()

また、エラー ハンドラを再試行する前に 1 秒待機させたい場合は、次のようにします。

setTimeout @waitformsg, 1000

バインドされた関数として定義したため、waitformsgメソッドは正しいコンテキストで実行されます。

私がここにいる間、さらにいくつかのこと:

  1. CoffeeScript ではusing@は using より慣用的であるthisため、コンストラクターは次のようにする必要があります。

    constructor: ->
      @waitformsg()
    
  2. jQuery のasync:trueフラグ$.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参照も維持する必要があり、関数のローカル スコープで新しい変数を作成し、その変数に代入することでこれを行うことができます (この場合、私はそれを new と呼びました)。可変)。その後、 を呼び出すことができます。thisthisselfself.waitformsg();

于 2012-08-27T16:08:50.400 に答える