javascript异步编程

javascript是一种单线程语言,不可能同时去执行两句不同的代码,所以不存在严格意义上的异步多线程执行,我们通常说的异步编程其实是有策略的调整js的执行队列,

以防造成ui阻塞。

		function func1() {
			for(var i = 0; i < 1000000000; i++);//耗时操作
			console.log("func1...");
		}

		function func2() {
			console.log("func2...");
		}
		func1();
		func2();
         //func1...
         //func2...

如上述代码,func1是一个非常耗时的操作,同步模式下,js执行完func1才会去执行func2;这种情况下func1会阻塞后面代码的执行,如果ui呈现是在func1后,那么也会阻塞ui,造成浏览器假死。

通常解决方案如下:利用setTimeout调整队列执行顺序

		function func1() {
			for(var i = 0; i < 1000000000; i++);
			console.log("func1...");
		}

		function func2() {
			console.log("func2...");
		}

		function func3() {
			console.log("func3...");
		}

		setTimeout(func1);//异步处理
		func2();
		func3();

		//func2...
		//func3...
		//func1...

利用setTimeout对耗时的func1进行异步处理,这样js将把主线程执行完再回过头去执行func1,不会造成主线程阻塞。当然如果 func2和func3的执行依赖于func1的执行,那么如上写法肯定会报错。异步编程可以理解为一个主线程加上一个异步线程,主线程里面一般是负责ui呈现或者主要逻辑的代码,异步线程里面是非常耗时的辅助代码。主线程执行完了才会执行异步线程。所以如果主线程里面的代码依赖于异步线程里的某些方法,那就会报错了。

通常跟回调函数结合使用:

		function func1(callback) {
			console.log("func1...");
			setTimeout(function() {
				callback();
			});
		}

		function func2() {
			for(var i = 0; i < 1000000000; i++);
			console.log("func2...");
		}

		function func3() {
			console.log("func3...");
		}

		func1(func2);
		func1(func3);
		//func1...
		//func1...
		//func2...
		//func3...

可以按照事件轮次理解:

		function func1(callback) {
			console.log("func1...");
			setTimeout(function() {
				callback();
			});
		}

		function func2() {
			for(var i = 0; i < 1000000000; i++);
			console.log("func2...");
			setTimeout(function a() {
				console.log("a...");
			})
		}

		function func3() {
			console.log("func3...");
			setTimeout(function b() {
				console.log("b...");
			})
		}

		func1(func2);
		func1(func3);
		//func1...
		//func1...
		//func2...
		//func3...
		//a...
		//b...

第一轮次执行的方法:func1  func1

第二轮次执行的方法:func2  func3

第三轮次执行的方法:a b

当然异步编程除了setTimeout外还有其他的方式:

如事件监听,原理就是(don‘t wait for me, i will call you);

还有观察者模式,是事件驱动模式的进化

ajax异步(用于传输耗时)

promise对象

 

posted @ 2017-04-13 16:02  策马咻咻咻  阅读(73)  评论(0)    收藏  举报