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;
}
});
});
}