我已经阅读了一些关于这个问题的答案,但我不知道该怎么办。
我有一个功能,它的想法是它将继续尝试通过AJAX连接,如果它失败,它将继续每5秒钟再次尝试提交信息。这对于我正在开发的网络应用程序非常重要,用户在50%的时间处于离线状态,50%的时间处于在线状态。
问题出在我当前的设置中,我想调用setTimeOut来延迟函数的执行,但我认为因为我在另一个函数内部,它不知道startAjaxSubmitLoop()函数的位置?但是,当我运行我的代码并检查控制台时,我看到数百万个连接到我的服务器一个接一个没有延迟。 就好像setTimeout()函数延迟属性根本不起作用但它仍在运行函数?
任何想法我做错了什么?
function startAjaxSubmitLoop(id,tech_id){
//TODO: Make POST instead of GET because of pictures.
var request = $.ajax({
url: "script.php",
type: "GET",
data: { }
});
//If Successfully Sent & Got Response.
request.done(function( msg ) {
//Sometimes because of weak connections response may send, but the message it worked might not come back.
//Keep sending until for sure SUCCESS message from server comes back.
//TODO: Make sure server edits existing entries incase of double sends. This is good in case they decide to edit anyways.
$( "#log" ).html( msg );
});
//If Failed...
request.fail(function( jqXHR, textStatus ) {
//Color the window the errorColor
//alert( "Request failed: " + textStatus );
setTimeout(startAjaxSubmitLoop(id,tech_id),5000);
console.log('test');
});
}
答案 0 :(得分:1)
您正在正确调用setTimeout
。您正在startAjaxSubmitLoop
行上立即呼叫setTimout
并将结果传递给setTimeout
而不是您的功能。 Modern setTimeout
implementations (es5)允许您将args传递给setTimeout,如下所示:
而不是:
setTimeout(startAjaxSubmitLoop(id,tech_id),5000);
使用:
setTimeout(startAjaxSubmitLoop, 5000, id, tech_id); //call startAjaxSubmitLoop in 5000ms with id and tech_id
这样做的标准方法是支持setTimeout
不接受参数的旧浏览器,只需将函数包裹startAjaxSubmitLoop
setTimeout(function(){startAjaxSubmitLoop(id, tech_id)}, 5000); //equivalent to above
答案 1 :(得分:1)
两种方法:
1)带回调函数: setTimeout(function(){startAjaxSubmitLoop(id,tech_id);},5000);
2)在函数名称(无括号)和超时期限后列出参数: setTimeout(startAjaxSubmitLoop,5000,id,tech_id);