javascript setTimeout没有激活

时间:2013-02-10 15:41:32

标签: jquery json settimeout

当我使用此代码时,它不会在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

2 个答案:

答案 0 :(得分:1)

你的setTimeout方法没有传递一个函数(显然是一个字符串很好:/)

setTimeout(function() { waitForEvents(last_id); }, 15000);

答案 1 :(得分:0)

传递到setTimeout的字符串在 global 范围内进行评估。我的猜测是,您的函数未在全局范围内定义,或者在全局范围内没有定义last_id值。

如果您的目标是重复使用传递给该函数的last_id参数,请将您的setTimeout调用更改为:

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

(另请注意,第二个参数应为数字,而不是字符串。)

以下是我在全球范围内评估的字符串的含义示例:

(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);

Live Example | Source

假设你有一个id "target"的元素并点击它,半秒后你会看到“foo called”出现在页面上,但你不会看到“bar被称为”。如果您使用的是任何现代浏览器,您将在JavaScript控制台中看到一条错误消息,指出bar未定义。那是因为没有名为bar全局函数,在包装函数中只有一个名为bar的函数。所以字符串版本失败了。

尽可能避免将字符串传递给setTimeout。它总是可能的。 (向达赖喇嘛道歉。)