Js异步回调解决方法

项目中遇到过好多次因为异步引起的变量没有值,所以意识到了认识js中同步与异步机制的重要性!
在单线程的js中,异步代码会被放入一个事件队列,等到所有其他代码执行后再执行,而不会阻塞线程。

下面是js几种最常见的异步情况:

1、异步函数 setTimeout和setInterval
异步函数,如setTimeout和setInterval,被压入了称之为Event Loop的队列。
setTimeout:在指定的毫秒数后,将定时任务处理的函数添加到执行队列的队尾。所以有时候也可以使用setTimeout解决异步带来的问题
setInterval:按照指定的周期(以毫秒数计时),将定时任务处理函数添加到执行队列的队尾。
Event Loop是一个回调函数队列。当异步函数执行时,回调函数会被压入这个队列。JavaScript引擎直到异步函数执行完成后,才会开始处理事件循环。这意味着JavaScript代码不是多线程的,即使表现的行为相似。事件循环是一个先进先出(FIFO)队列,这说明回调是按照它们被加入队列的顺序执行的。
2、ajax
3、node.js中的许多函数也是异步的

例如:我们要打印ajax返回的值正常要:
    
	function getData(){
		$.ajax({
			url : ...,
			success : function(data){
				console.log(data);
			}
		})
	}
	
	//由于ajax是异步的,js并不会等待ajax运行完后在执行下面的操作,所以这样是打印不出值得。
	var data;
	function text(){
		getData();
		console.log(data);
	}
	
	function getData(){
		$.ajax({
			url : ...,
			success : function(res){
				data = res;
			}
		})
	}

	//当然我们也有更优雅的方式使用 Promise
	var getData = new Promise (function (resolve,reject) {
		$.ajax({
			url: ...,
			success: function(message){
				if(message.type == 1){
					resolve(message);  //在异步操作成功时调用
				}else{
					reject(message);  //在异步操作失败时调用
				}
			}
		});
	})

	//resolve方法返回的消息就会在then中被捕获,而reject方法返回的消息会被catch捕获
	getData.then(function(res){
		console.log(res);
	}).catch(function(error){
		console.log(error)
	})

	//如果下一步操作依赖于多个方法返回的数据,可以使用Promise的all方法
	Promise.all([getData1,getData2]).then(function([ResultJson1,ResultJson2]){	
 		 //这里写等这两个ajax都成功返回数据才执行的业务逻辑
	})

这样的代码分工非常明确,ajax就是拿数据的,.then .catch方法就是处理业务逻辑,代码异常清晰。

你可能感兴趣的:(Js异步回调解决方法)