推荐书籍:https://www.kancloud.cn/kancloud/you-dont-know-js-async-performance
为了解决回调地狱带来的维护麻烦。引入promise

1.用promise封装一个http请求

  1. <script>
  2. function http() {
  3. return new Promise((resolve, reject) => {
  4. $.ajax({
  5. url:"http://192.168.4.18:3000/top/playlist/?cat=华语",
  6. method:"get",
  7. success:res=>{
  8. resolve(res)
  9. },
  10. error:res=>{
  11. reject(res)
  12. }
  13. })
  14. })
  15. }
  16. http().then(res=>{
  17. console.log(res);
  18. })
  19. </script>

2.用async和await替换then来解决异步问题

  1. var a = new Promise((resolve,reject)=>{
  2. setTimeout(()=>{
  3. resolve(1)
  4. },2000)
  5. })
  6. var b = new Promise((resolve,reject)=>{
  7. setTimeout(()=>{
  8. resolve(2)
  9. },1000)
  10. })
  11. // 不能解决异步问题
  12. a.then(res=>{
  13. console.log(res);
  14. })
  15. b.then(res=>{
  16. console.log(res);
  17. })
  18. // 能解决异步问题
  19. async function go(){
  20. var res = await a;
  21. var num = await b;
  22. console.log(res);
  23. console.log(num);
  24. }
  25. go()

3 关于运行顺序的问题

  1. <script>
  2. console.log(3);
  3. setTimeout(() => {
  4. console.log(2);
  5. }, );
  6. Promise.resolve().then(()=>{
  7. console.log(1);
  8. })
  9. </script>
  10. <!-- 这个块单独运行return 3 1 2 -->
  11. <script>
  12. async function show(){
  13. console.log(4);
  14. var res = await 5;
  15. console.log(res);
  16. }
  17. show();
  18. console.log(6);
  19. </script>
  20. <!-- 这个块单独运行return 1 2 100 -->
  21. <!-- 两个块一起运行 return 3 1 4 6 5 2 -->
  1. <!-- 1.promise 中的语句除了resolve,reject能直接执行
  2. 2.遇到await先跳出函数执行他的同步代码,最后执行自己
  3. 3.定时器最后执行
  4. -->
  5. <script>
  6. async function show(){
  7. console.log("start");
  8. var res = await go();
  9. console.log(res);
  10. }
  11. async function go (){
  12. return 1;
  13. }
  14. show();
  15. setTimeout(() => {
  16. console.log(4);
  17. }, );
  18. var p = new Promise((resolve,reject)=>{
  19. console.log(2);
  20. resolve(3);
  21. console.log(5);
  22. })
  23. p.then((res)=>{
  24. console.log(res);
  25. })
  26. console.log("end");
  27. </script>
  28. <!-- return start 2 5 end 1 3 4 -->