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对象

浙公网安备 33010602011771号