$(document).ready(function(){
var FREQ = 10000 ;
var repeat = true;
function showFrequency(){
$("#freq").html( "Page refreshes every " + FREQ/1000 + " second(s).");
}
function startAJAXcalls(){
if(repeat){
setTimeout(
function() {
getXMLRacers();
startAJAXcalls();
},
FREQ
);
}
}
function getXMLRacers(){
$.ajax({
url: "finishers.xml",
cache: false,
dataType: "xml",
success: function(xml){
$('#finishers_m').empty();
$('#finishers_f').empty();
$('#finishers_all').empty();
$(xml).find("runner").each(function() {
var info = '<li>Name: ' + $(this).find("fname").text() + ' ' + $(this).find("lname").text() + '. Time: ' + $(this).find("time").text() + '</li>';
if( $(this).find("gender").text() == "m" ){
$('#finishers_m').append( info );
}else if ( $(this).find("gender").text() == "f" ){
$('#finishers_f').append( info );
}else{ }
$('#finishers_all').append( info );
});
getTimeAjax();
}
});
}
function getTimeAjax(){
$('#updatedTime').load("time.php");
/*
var time = "";
$.ajax({
url: "time.php",
cache: false,
success: function(data){
$('#updatedTime').html(data);
}
});
*/
}
$("#btnStop").click(function(){
repeat = false;
$("#freq").html( "Updates paused." );
});
$("#btnStart").click(function(){
repeat = true;
startAJAXcalls();
showFrequency();
});
showFrequency();
getXMLRacers();
startAJAXcalls();
});
這是在HeadFirst JQuery第八章中出現的,爲什麽其中的
startAJAXcalls可以實現有序自調用呢?萬一getXMLRacers()調用卡住超過十秒,它還能實現有序嗎?
它裏面說了很多:
Since we wait until the last call to our function is finished, we use the setTimeout function.
Self-referencing functions
A self-referencing function calls itself during its normal operations. Such functions can be particularly
useful when you need to wait for the function’s currently running operation to complete before running
it again. Combine this with a setTimeout call, and you can schedule a function to run but only keep
going if the previous call to the function was successful. Otherwise, it won’t reach the call to itself in the
code, and hence it won’t be called again.
其實我理解主要是setTimeout中的函數的調用是多線程,因此不會阻塞主線程,還有一個前提就是getXMLRacers()不會卡住超過10秒,否則就會出現startAJAXcalls並行運行的局面,不能保證有序了。
現在這樣測試:
FREQ=100;
function startAJAXcalls(){
if(repeat){
alert("start");
setTimeout(
function() {
alert("xml racers started");
getXMLRacers();
sleep(5000);
alert("ajax calls started");
startAJAXcalls();
alert("ajax calls finished");
},
FREQ
);
alert("end");
}
}
function sleep(numberMillis) {
var now = new Date();
var exitTime = now.getTime() + numberMillis;
while (true) {
now = new Date();
if (now.getTime() > exitTime)
return;
}
}
發現運行中這些alert數量都是1:1,而且alert("ajax calls finished");每次都會執行到,真是奇之怪哉,不同於java中的遞歸表現。真如其所說,self-referencing調用會等上次調用執行完畢后才會去調用,但是爲什麽呢?是什麽機制。
分享到:
相关推荐
2.setTimeout(code,millisec) setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。 参数 描述 code 必需,要调用的函数后要执行的 JavaScript 代码串。 millisec 必需,在执行代码
注:调用过程中,可以使用clearTimeout(id_of_settimeout)终止 参数 描述 code 必需,要调用的函数后要执行的 JavaScript 代码串。 millisec 必需,在执行代码前需等待的毫秒数。 setTimeinterval ...
用了setTimeout()想实现递归调用,如果第一个参数不加引号的话,就会出错,下面与大家分享下该如何解决
setTimeout与setInterval执行 首先我们看一下以下代码打印结果 console.log(1); setTimeout(function() { console.log(2); },100) setTimeout(function() { console.log(3); },50) console.log(4); 打印结果是 ...
JavaScript中setTimeout和setInterval函数的传参及调用_.docx
本文实例分析了JS中setTimeout()无法调用带参函数问题的解决方法。分享给大家供大家参考,具体如下: 解决方法:重写setTimeout() 方法,需要用到闭包函数。如下: var _st = window.setTimeout; window.setTimeout...
setTimeout()从载入后延迟指定的时间去执行一个表达式或者是函数;仅执行一次 ;和window.clearTimeout一起使用.我在 代码如下:$(document).ready(function(){setTimout(test(),200); function test() { alert(1&#...
关于JS中setTimeout()无法调用带参函数问题的解决方法.docx
主要介绍了解决vue 使用setTimeout,离开当前路由setTimeout未销毁的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
javascript中定时器setTimeout的用法一般如下,调用beginrotate之后就进入定时执行rotateloop的一个过程,如下代码: 代码如下: var angle = 0; function rotateloop() { if (angle < 360) { angle++; //use ...
本文实例讲述了js基于setTimeout与setInterval实现多线程的方法。分享给大家供大家参考,具体如下: javascript无法实现线程阻塞(sleep),原因是因为sleep涉及系统调用。js出于安全考虑是不允许系统调用的。 如果...
解决方法如下: 1、定义一个self暂存this 2、再改变变量的值,则生效啦 var self=this;...当在vue中使用定时器来修改一个变量值的时候,发现没有效果,这是由于setTimeout函数调用的代码运行在与所
本文实例分析了js超时调用setTimeout和间歇调用setInterval的用法。分享给大家供大家参考。具体如下: 今天看了javascript高级程序设计(第三版)一书,发现说setTimeout比setInterval更好,觉得的确如此。平时都是...
为了加强对JavaScript原生代码的编写能力,以及巩固setTimeout()的使用方法,制作了一个倒计时的demo,倒计时在现在的网站中算是一个常见的小功能,如果大家喜欢的话可以留下,就当作一个日常实用的小脚本。 实现...
主要为大家详细介绍了js使用setTimeout实现轮循动画,具有一定的参考价值,感兴趣的小伙伴们可以参考一下