JS语言的执行环境是“单线程”。所谓单线程,就是一个时间只能完成一个任务,如果有多个任务,就必须排队。
“单线程”的坏处是:只要有一个任务耗时很长,后面的任务就必须排队等待,会拖延整个程序的执行。
为了解决这个问题,JS的任务执行模式分为两种:同步(synchronous)和异步(asynchronous)。
同步模式就是上面提到的,后面的任务等待前面的任务完成后,才能执行。程序执行顺序和程序排列顺序一致。
异步模式,每一个任务都有一个或者多个回调函数,前一任务完成,先是执行回调函数。
一,回调函数
给耗时长的函数添加回调函数,这个回调函数是原本这个任务执行完成之后要执行的函数,来达到避免后续函数执行被前面的函数阻塞;
//f1函数是一个耗时的任务
function f1(f2){
setTimeout( function(){
for(var i=0;i<10000;i++){
console.log(i)
}
},1000);
f2();
}
//f2函数用来改变背景颜色
function f2() {
document.body.style.backgroundColor = "white";
}
f1(f2);
这样做,达到了f2函数不被f1函数长时间的执行所阻塞,而是把耗时的程序推迟执行。
二,promise对象
ES6新特性Promise,可以将异步操作以同步操作的流程表达出来,避免层层嵌套的回调函数。
var promise = new Promise(function(resolve,reject){
if( /*异步操作成功*/ ){
resolve();
}else{
reject();
}
});
//.then方法
promise.then(
function(){ //success } ,
function(){ //failure }
);
new Promise()构造函数接受一个函数作为参数,这个函数又接受两个参数分别为resolve和reject方法。如果异步操作完成,就调用resolve方法将Promise对象实例的状态变为“成功”(从pending到resolved);如果异步操作失败,就用reject方法将Promise对象实例的状态变成失败(从pending到rejected)。
。then方法,分别给resolve方法和reject方法指定回调函数。
三,事件监听
给耗时长的函数绑定一事件,事件触发后就执行后来的函数。