当我使用此代码时,它不会在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
答案 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);
假设你有一个id
"target"
的元素并点击它,半秒后你会看到“foo called”出现在页面上,但你不会看到“bar被称为”。如果您使用的是任何现代浏览器,您将在JavaScript控制台中看到一条错误消息,指出bar
未定义。那是因为没有名为bar
的全局函数,在包装函数中只有一个名为bar
的函数。所以字符串版本失败了。
尽可能避免将字符串传递给setTimeout
。它总是可能的。 (向达赖喇嘛道歉。)