咱们的网易云音乐系列课,尾声了,今天咱们要将一个最重要的东西--关于ES7 async结合Fetch异步编程问题。html
ES7 async/await被称做异步编程的终极解决方案,咱们先无论这个称呼,我们先总结一下,过去5次分享咱们一路走来异步编程是如何产生,到最后如何解决的。ajax
第一次分享咱们学会了切图和动态计算响应式rem布局,第二次分享咱们体会了如何学习使用原生js进行学习轮播图,第三次分享了H5 audio这块,进而引出了第四次的异步请求歌词ajax和第五次的Fetch+promise解决方案。编程
可是每一种方案都不完美,咱们经过代码来讲明。promise
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> var a = 12; //模拟数据交互须要等1秒钟 function loadData() { setTimeout(function () { a = 666; }, 1000) } loadData(); console.log(a); </script> </head> <body> </body> </html>
不用想,这个结果就是 12 而不是666,由于程序不会等1s才往下执行,可是有时候又必须使用数据,因此只能嵌套。可是嵌套多了又会出现下面的问题,案例来自SF的朋友,特此感谢。异步
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> setTimeout(function () { console.log("第一个异步回调了!") setTimeout(function () { console.log("第二个异步回调了!") setTimeout(function () { console.log("第三个异步回调了!") setTimeout(function () { console.log("第四个异步回调了!") setTimeout(function () { console.log("第五个异步回调了!") }, 1000); }, 1000); }, 1000); }, 1000); }, 1000); </script> </head> <body> </body> </html>
我特地写了一个程序,这下你们就能体会他的缺陷。async
那咱们怎么解决呢?异步编程
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> function timeout(ms) { return new Promise((resolve, reject) => { setTimeout(resolve, ms, "finish"); }); } timeout(2000) .then(value => { console.log("第一层" + value); return timeout(2000); }) .then(value => { console.log("第二层" + value); return timeout(2000); }) .then(value => { console.log("第三层" + value); return timeout(2000); }) .then(value => { console.log("第四层" + value); return timeout(2000); }) .then(value => { console.log("第五层" + value); return timeout(2000); }) .catch(err => { console.log(err); }); </script> </head> <body> </body> </html>
Promise改为了链式,可是不够完美,重点来了,今天的知识如何使用ES7 的async和await 让咱们跟咱们写平常普通代码同样写异步代码呢?
你们发现了吧,这样写是否是正确而且简单了啊,仅仅是加了两个单词而已,完整代码布局
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script> function timeout(ms) { return new Promise((resolve, reject) => { setTimeout(resolve, ms, "finish"); }); } async function asyncTimeSys() { await timeout(1000); console.log("第一层异步结束!") await timeout(1000); console.log("第二层异步结束!") await timeout(1000); console.log("第三层异步结束!") await timeout(1000); console.log("第四层异步结束!") await timeout(1000); console.log("第五层异步结束!") return "all finish"; } asyncTimeSys().then((value) => { console.log(value); }); </script> </head> <body> </body> </html>
好,咱们不整没用的咱们看看实际项目里面怎么搞的,仍是拿网易云举例:学习
ok,感受天都亮了。ui
简单吧,经过这个系列课程的学习你们已经完整的了解了一个项目的大致开发过程,同时也了解了一些容易出错的方方面面,重点是涵盖了ES6和ES7的新知识。
固然,彻底靠我讲你们体会不深,仍是但愿你们可以真的本身认真练习,把这个项目作出来,而不是变成听听而已。
本系列教程就到这,欢迎有问题想交流的同窗,或者有专门技能提高需求的同窗,到留言区里互相交流。