`

為何setTimeout的ajax可以實現有序自調用

阅读更多
$(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調用會等上次調用執行完畢后才會去調用,但是爲什麽呢?是什麽機制。

 

 

分享到:
评论

相关推荐

    jQuery Popeye实现的无序图片列表转换成有序并播放.zip

    这个名为"jQuery Popeye实现的无序图片列表转换成有序并播放.zip"的压缩包文件显然涉及到使用jQuery库来处理图片展示的一个功能,特别是将无序的图片列表转化为有序的播放模式。 首先,jQuery Popeye是一个插件,它...

    面试资料整理.docx

    - 场景一:`setTimeout`中的闭包可以用来传递参数并在延迟后执行。 - 场景二:回调函数,如事件处理,闭包可以将函数绑定到特定事件,保留上下文。 - 场景三:封装变量,通过闭包创建只能通过特定接口访问的私有...

    Javascript典型应用例程(源程序)

    在这个压缩包中,你可能会看到这些概念的实际应用,比如使用AJAX进行异步数据获取、实现简单的动画效果、使用定时器(setTimeout、setInterval)来执行延迟任务、利用闭包实现模块化等。通过分析和运行这些源码,你...

    JS不中断时无法执行

    5. **定时器或延迟**:为了确保每次缩放操作完全执行,可以考虑使用`setTimeout`或`requestAnimationFrame`来添加微小的延迟,使得每次缩放动作之间有间隔,让浏览器有时间处理前一次的变更。 6. **调试技巧**:...

    JavaScript教程源代码

    数组则用于存储一组有序的数据,可以使用索引访问。此外,ES6引入了新的数据结构Set和Map,它们提供了更高效的数据管理方式。 函数是JavaScript的重要组成部分,它们可以作为值传递,也可以用作对象的方法。函数...

    JAVASCRIPT学透

    数组则用于存储一组有序的数据,可以通过索引访问。ES6引入了扩展运算符、解构赋值等新特性,使操作更加便捷。 3. **函数与作用域**:函数是JavaScript的基本单元,可以作为参数传递,也可以作为返回值。函数内部的...

    JavaScript 语言参考 中文版(CHM)

    JavaScript可以调用一系列Web API,如定时器(setTimeout, setInterval)、XMLHttpRequest(用于AJAX)和Fetch API(更现代的HTTP请求方式)等。 微软的JavaScript语言参考中文手册涵盖了以上所有内容,并可能包含...

    非常有用的js,js实例

    9. **异步编程**:JavaScript是单线程的,但通过异步编程可以处理耗时操作,如定时器(setTimeout、setInterval)、Promise和async/await。这些工具使开发者能处理回调地狱,提高代码可读性。 10. **ES6+新特性**:...

    js作业.rar

    5. **数组与对象**:数组是有序的数据集合,可以使用索引访问。对象则由键值对组成,键可以是字符串或符号,值可以是任意类型。 6. **事件处理**:JavaScript 可以通过添加事件监听器来响应用户的交互,如 `click`...

    1.JavaScript基础.zip

    14. Web API:JavaScript可以调用浏览器提供的各种API,如定时器(setTimeout、setInterval)、地理位置API、WebSocket等。 15. 模块化:通过CommonJS(Node.js中使用)和ES6的模块系统实现代码的组织和重用。 ...

    javascript学习知识大全.rar

    12. **Web API**:如定时器(setTimeout、setInterval)、XMLHttpRequest(用于Ajax请求)和Fetch API,用于与服务器进行通信。 13. **Node.js**:JavaScript也可以用于服务器端开发,Node.js提供了丰富的模块系统...

    Javascript培训文档

    7. **AJAX与Fetch**:AJAX(Asynchronous JavaScript and XML)允许页面在不刷新的情况下与服务器通信,Fetch API是现代浏览器中更现代的替代方案,两者都用于实现异步数据获取。 8. **模块化**:CommonJS、AMD...

    javascript 各式源码(共20类 343个例子)

    JavaScript是一种广泛应用于网页和网络应用的脚本语言,它的强大在于能够实现动态交互,使得网页内容可以实时更新,用户交互性大大增强。本资源包含20类共计343个JavaScript源码示例,覆盖了JavaScript开发中的诸多...

    一个经典的JavaScript教程

    通过DOM,JavaScript可以查找、修改和添加页面上的元素,实现动态更新页面。 AJAX(异步JavaScript和XML)技术允许在不刷新整个页面的情况下,从服务器获取数据并局部更新页面,提高了用户体验。现在,fetch API...

    JavaScript基础总结

    JavaScript是单线程的,但可以通过异步编程处理耗时操作,如Ajax请求、定时器(setTimeout、setInterval)和Promise。ES6引入了async/await,使得异步代码看起来更像同步代码,提高了可读性。 以上是JavaScript...

    网易(企业邮箱)java工程师面经1

    例如,使用`BufferedReader`的基本步骤包括创建文件输入流、包装成BufferedReader对象,然后调用`readLine()`方法循环读取每一行。 ```java FileInputStream fis = new FileInputStream("file.txt"); ...

    jQuery中的deferred使用方法

    它不仅适用于AJAX请求,还可以自定义异步操作,并且通过`promise()`方法实现更安全的回调管理。理解并熟练运用`deferred`对象,能显著提升你的JavaScript编程能力,特别是在构建复杂的异步应用时。

    ⼤⼚⾼级前端⼯程师⾯试题汇总

    当主线程空闲时,会从事件队列中取出一个任务执行,这种方式避免了阻塞,实现了非阻塞I/O操作,如定时器、网络请求等。通过这种机制,JavaScript可以在浏览器环境中高效地处理用户交互和网络通信。 【TCP、UDP与...

    classnoteswd83

    随着ES6的引入,模块化成为可能,通过`export`和`import`关键字可以实现代码的模块化管理。 3. **面向对象** JavaScript 是基于原型的面向对象语言,对象可以通过字面量方式创建,也可以通过构造函数创建。原型链...

    panorambler.github.io

    11. **Web API**:JavaScript可以直接调用浏览器提供的API,如定时器(setTimeout、setInterval)、Ajax(XMLHttpRequest或fetch)、WebSocket等,实现与服务器的通信或实现其他高级功能。 12. **ES新特性**:...

Global site tag (gtag.js) - Google Analytics