新事物的诞生并被肯定,其中一定经历了时代的磨砺和市场的不断验证;
es7 推出async 异步方法,让端开发人员用同步的思想去使用异步,从此开发bug和工作量大大减少;因为我们更习惯叫JavaScript是顺序加载的语言就是从下到下依次运行
异步出现
JavaScript执行环境一直都是单线程
单线程是指:一次只能执行一个任务。如果有多个任务,没办法只能排队,等待上一个任务完成,才可以继续,就这样在等待中执行完所有代码任务;
好处和问题相继出现
执行环境相对简单,实现代码也比较容易,但是坏处也随着而来,一个地方实现不顺畅或者实现时间太长,后面的任务就要排队等候,出现假死(整个浏览器无响应)
异步的出现
为了解决上述问题,聪明的人类就给JavaScript 开创出了新的运行机制;那些耗时、等待时间较长的让它自己去执行,其他的任务也可继续执行;已是JavaScript推出了两种执行模式:同步(Synchronous)和异步(Asynchronous)
异步(也叫非阻塞加载)的推出让JavaScript 踏上了光辉之路
异步的变迁
回调函数
这是异步最简单的方法
看一个同步记载的例子
console.log('1');
alert('2');
console.log('3');
同步打印1,弹出2,打印3,取决于按下‘确定’框的时间,不按就一直卡顿在那
那么如何做不等待第2部弹框,继续执行,早期方法回调函数
function f1(callback){
setTimeout(function(){
callback();
},1000)
}
function f2(){
alert('2');
}
console.log('1');
f1(f2);
console.log('3');
这样所有的任务就是该干嘛就干嘛去,互不影响,程序得以执行,早期推行回调方法执行异步,比如图片加载,接口请求用的不亦乐乎;毕竟不影响我们继续执行后面的代码,不影响网页加载。
但是人们心里还是比较挂念,同步的写法,回调方法固然能解决问题,但是繁琐,如这样的f1(f2)调用费解 ,于是 es6推出Promises对象,友好的操作
Promises 操作异步
Promises,每一个异步任务返回一个Promise对象,该对象有一个then方法,允许指定回调函数。比如,f1的回调函数f2,可以写成:
f1().then(f2)
对比一下原来的 f1(f2) 看上去更加直观,那么整个异步怎么实现的呢?
实现一下
function f1(