js睡眠

JavaScript中没有内置的sleep方法,但可以通过setTimeout实现延迟执行。常用于在回调函数执行后,确保后续操作基于正确的数据进行。需要注意的是,如果后续代码依赖回调函数的数据,必须谨慎使用延迟执行,避免数据不准确。解决办法包括将后续代码放入回调函数或利用闭包。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java

前言

在java里,有睡眠方法(即sleep)。


应用场景

用于线程睡眠。


js

前言

在js里,没有睡眠方法,只有延迟执行一个函数或一段代码。


应用场景

应用场景是,如果某个操作有回调函数(比如,监听器啥的。),而且这个操作(假如是查询数据)费时很长,那么回调函数就一直没有执行——但是呢,该操作的后面的代码又是基于回调函数的,需要用到回调函数里的数据。


需要特别注意的是,凡是某个操作有回调函数,那么这个时候js代码相当于是异步执行的,异步执行的好处是后面的代码不需要等待前面的代码执行完毕就可以同时执行,但是坏处是如果后面的代码基于前面的代码(即回调函数)的数据,那么这个时候后面的代码就需要延迟执行。


具体如何使用

按是否需要传递参数,分2种,

1、不需要传递参数

setTimeout(函数名或者"函数名",毫秒数);

2、需要传递参数

一、参数是字符串

示例

// 添加点标记和信息窗口
	setTimeout("addMarkerAndInfoWindowAnalyze('" + eventType + "')", 500);


二、参数是对象

示例

setTimeout(function(){ 函数名字(obj); }, 1000);



参考:

http://boleyn.iteye.com/blog/1144015

http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html



总结

实际上,延迟函数只能应用于后面的代码不需要使用回调函数里的数据的情况下,否则,千万不能使用延迟函数,因为极有可能后面的代码先于回调函数执行,这个时候后面的代码拿到的数据就不是准确的。


那么如果后面的代码需要用到回调函数里的数据,该怎么办呢?方法有2种,

1、直接把后面的代码放在回调函数里面。

如果回调函数里的数据是在循环里面的话,那么要把后面的代码放到循环里面——并且还要添加一个判断数据是否是最终数据的条件。

3、采用闭包(待研究?)。


示例代码

/**
 * 查询事件
 * 
 * @param tableId
 *            表id
 */
function queryEventType(tableId) {
	var searchOptions = {
		// map: mapObj,
		pageSize : 100, // 每次查询数据的数量(最多只能查询100)
		orderBy : '_id:ASC' // 按id升序排列数据
	};

	AMap.service([ "AMap.CloudDataSearch" ], function() {
		var search = new AMap.CloudDataSearch(tableId, searchOptions);
		search.searchByDistrict("银川市", function(status, result) {
			if (status == 'complete') {
				dataTypeNumbers[dataType] = result.count; // 保存当前数据类型的数量
				
				// 计算查询次数,然后循环查询
				// 把每次的查询数据拼接到一个数组里面去
				var queryNumber = Math.ceil(dataTypeNumbers[dataType] / 100);
				for ( var i = 1; i <= queryNumber; i++) {
					var searchOptions1 = {
						pageSize : 100,
						pageIndex : i,
						orderBy : '_id:ASC' // 按id升序排列数据
					};

					var search1 = new AMap.CloudDataSearch(tableId,
							searchOptions1);

					search1.searchByDistrict("银川市", function(status, result) {
						if (status == 'complete') {
							dataTypeDatas[dataType] = [];
							dataTypeDatas[dataType] = dataTypeDatas[dataType]
									.concat(result.datas); // 保存当前数据类型的数据
							
							// 如果当前数据类型的数量与总数相等,那么才开始处理其他的各项操作
							if(dataTypeDatas[dataType].length == result.count){
								// 1.获取页数量
								getPageCountAnalyze();

								// 2.拼接数据和分页按钮
								pingJieDataAndPageButtonAnalyze();
								
								// 3.把拼接数据设置到指定div
								setPingJieDataToDivAnalyze();
								
								// 4.添加点标记和信息窗口
								addMarkerAndInfoWindowSwitchAnalyze();
							}						
						} else {
							return;
						}
					});
				}
			} else {
				return;
			}
		});
	});
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值