1.es2017标准中引入了async,使得异步(async)操作更加方便

如有以下代码,定时器是异步执行的,代码并没有在阻塞等待定时器执行完再往下执行,是先打印了hello再打印的定时器:

  1. <script>
  2. function print(){
  3. setTimeout(function(){
  4. console.log("定时器");
  5. },1000);
  6. console.log("hello");
  7. }
  8. print();
  9. </script>

如果我们想实现按顺序执行的话可以用Promise、async和awit来实现同步(sync)处理,如下:

  1. <script>
  2. function timeout(ms) {
  3. return new Promise(function (resolve, reject) {
  4. setTimeout(function () {
  5. console.log('定时器');
  6. resolve();
  7. }, ms);
  8. });
  9. }
  10. async function asyncPrint(ms) {
  11. await timeout(ms);
  12. console.log('hello');
  13. }
  14. asyncPrint(100);
  15. </script>

2.接口同步(sync)顺序执行

我们经常会遇到接口请求是要按顺序执行的情况,比如接口2的参数需要从接口1中拿到之后传进去的,像这种情况可以用Promise、async和awit来实现同步(sync)处理,如下:
项目用到了jquery,可以到官网下载:https://jquery.com/download/

  1. <head>
  2. <meta charset="UTF-8">
  3. <title>Document</title>
  4. <script src="./jquery-3.6.0.min.js"></script>
  5. </head>
  6. <body>
  7. <script>
  8. function ajax(url) {
  9. return new Promise(function (resolve, reject) {
  10. $.getJSON(url, function (result) {
  11. resolve(result)
  12. }, function (error) {
  13. reject(error)
  14. })
  15. });
  16. }
  17. async function getInfo() {
  18. // var id_data;
  19. // // 可以用.then方法来处理得到data
  20. // await ajax("http://iwenwiki.com/api/generator/list.php").then(
  21. // (data) => {
  22. // console.log(data);
  23. // id_data = data;
  24. // },
  25. // (error) =>{
  26. // console.log(error);
  27. // }
  28. // )
  29. // console.log(id_data);
  30. // 也可以直接接收Promise对象里最终执行的函数返回值。
  31. var id = await ajax("http://iwenwiki.com/api/generator/list.php")
  32. console.log(id);
  33. var info = await ajax("http://iwenwiki.com/api/generator/id.php?id=" + id[0])
  34. console.log(info);
  35. var result = await ajax("http://iwenwiki.com/api/generator/name.php?name=" + info.name)
  36. console.log(result);
  37. }
  38. getInfo();
  39. </script>
  40. </body>

image.png