js睡眠

2973 ワード

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