0

このコードを使用している場合、jQuery からの成功の戻り時に setTimeout がアクティブ化されていません

function waitForEvents(last_id){
$.ajax({
            type: "GET",
            url: "/functions/ajax.php?func=feed&old_msg_id="+last_id,

            async: true, /* If set to non-async, browser shows page as "Loading.."*/
            cache: false,
            timeout:50000, /* Timeout in ms */

            success: function(data){
                var json = jQuery.parseJSON(data);
                if(json !== 'null') {
                $.each(json.earnings, function (index, value) {
                     $('#feed').append(value);
                });
                var old_msg_id = json['last_id'];
                }
                alert("working");
                setTimeout('waitForEvents(last_id)',"1000");  
            },

            error: function (XMLHttpRequest, textStatus, errorThrown){
                alert("Error:" + textStatus + " (" + errorThrown + ")");
                setTimeout('waitForEvents(last_id)',"15000");       
            },
});
};

実際に(データ)を返しているため、settimeoutを再度アクティブにせずに応答を処理しているため、理由はわかりません

4

2 に答える 2

1

あなたの setTimeout メソッドは関数を渡していません (明らかに文字列は問題ありません:/)

setTimeout(function() { waitForEvents(last_id); }, 15000);
于 2013-02-10T15:43:10.560 に答える
0

渡す文字列は、グローバルスコープsetTimeoutで評価されます。私の推測では、関数がグローバル スコープで定義されていないか、グローバル スコープで値が定義されていません。last_id

last_id関数に渡された引数を再利用することが目的の場合は、setTimeout呼び出しを次のように変更します。

setTimeout(function() {
    waitForEvents(last_id);
}, 1000); // Or 15000 for the other call

(また、2 番目の引数は文字列ではなく数値にする必要があることに注意してください。)

グローバル スコープで評価される文字列の意味の例を次に示します。

(function($) {

  $("#target").click(function() {
    setTimeout(foo, 500);
    setTimeout("bar()", 500);
    display("Timers started");
  });

  function foo() {
    display("foo called");
  }

  function bar() {
    display("bar called");
  }

  function display(msg) {
    $("<p>").html(String(msg)).appendTo(document.body);
  }

})(jQuery);

実例| ソース

を持つ要素があり、id "target"それをクリックすると、0.5 秒後にページに "foo called" が表示されますが、"bar called" は表示されません。最新のブラウザーを使用している場合は、JavaScript コンソールにbar未定義であることを示すエラー メッセージが表示されます。これは、 というグローバル関数がなくbar、 というラッパー関数内の関数しかないためbarです。したがって、文字列バージョンは失敗します。

setTimeout可能な限り、文字列を渡すことは避けてください。いつでも可能です。(ダライ・ラマに謝罪。)

于 2013-02-10T15:51:59.790 に答える