JS中的异步编程方法
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方法指定回调函数。
三,事件监听
给耗时长的函数绑定一事件,事件触发后就执行后来的函数。
夏天来了又走,纯真它从未停留...