异步函数拿多个不同时间打印的数据,不能用return,得用回调函数。若需要控制顺序,则应该主执行函数嵌套,但嵌套多了,代码就不方便维护。这就是回调地狱

    es5用回调函数拿异步数据。
    es6用then拿,最终用async

    Promise对象用于异步按想要的顺序打印多个不同时间的数据,配合async和 await 可以用同步的方式写异步获取数据。

    1. //promise对象 最经典的方法,记住!
    2. //resolve可以将异步数据传递出来
    3. let p = new Promise(function(resolve){
    4. resolve("hello world")
    5. });
    6. //通过then拿到异步数据 es6
    7. p.then(function(data){
    8. console.log(data); //data就是resolve传出来的数据(hello world)
    9. });
    10. //resolve传出来的值,是then里面的形参
    11. 以上是es6老方法
    12. ----------------------------------------------------------------------------------
    13. 以下是es6 async新方法
    14. 比异步函数写法好一些,避免回调地狱,但异步一多会有一堆then
    15. function getTea(){
    16. return new Promise(funciton(resolve){
    17. setTimeout(()=>{
    18. resolve("奶茶");
    19. },1000)
    20. })
    21. };
    22. function getHotpot(){
    23. return new Promise(function(resolve){
    24. setTimeout(()=>{
    25. resolve("火锅");
    26. },2000)
    27. })
    28. }
    29. //先吃火锅,再喝奶茶
    30. //Promise写法的链式获取异步操作
    31. getHotpot().then(function(data){
    32. console.log(data);
    33. return getTea();
    34. }).then(function(data){
    35. console.log(data);
    36. })
    37. //两秒输出火锅,再一秒输出奶茶
    38. -------------------------------------------------------------------------------
    39. //async函数,解决异步数据问题的终极方法
    40. function getTea(){
    41. return new Promise(funciton(resolve){
    42. setTimeout(()=>{
    43. resolve("奶茶");
    44. },1000)
    45. })
    46. };
    47. function getHotpot(){
    48. return new Promise(function(resolve){
    49. setTimeout(()=>{
    50. resolve("火锅");
    51. },2000)
    52. })
    53. }
    54. //以上同上
    55. //async函数,解决异步数据问题的终极方法
    56. async function getData(){
    57. //await后面跟Promise对象 加await可以直接获取resolve传递出来的异步数据,不用then了
    58. let hotpot = await getHotpot();// getHotpot()是一个promise对象
    59. console.log(hotPot);
    60. let tea = await getTea();
    61. console.log(tea);
    62. //看着像同步执行了
    63. }
    64. getData(); //输出 火锅 奶茶

    image.png

    async函数的返回值是promise对象

    1. async function fun(){
    2. return 1;
    3. };
    4. let a = fun();
    5. console.log(a);
    6. 打印Promise {1}
    7. --------------------------------------------------------------------
    8. //async其实就是Promise对象的简写
    9. async function fun(){
    10. return 1;
    11. };
    12. //以上换成Promise写法,二者一模一样
    13. function fun(){
    14. return new Promise((resolve) => {
    15. resolve(1);
    16. })
    17. };
    18. fun().then((data)=>{
    19. console.log(data);
    20. })
    21. -----------------------------------------------------------------
    22. //async await写法
    23. //p1是Promise对象
    24. let p1 = new Promise((resolve) => {
    25. resolve(1)
    26. })
    27. //p2是Promise对象
    28. let p2 = new Promise((resolve) => {
    29. resolve(2)
    30. })
    31. async function fun(){
    32. let a = await p1;
    33. let b = await p2;
    34. console.log(a);
    35. console.log(b);
    36. }
    37. fun();
    38. -------------------------------------------------------------------

    题目1:
    image.png执行结果 200 100 不明白注释

    题目2:
    image.png打印 1 3 5 8 2 6 7 4

    总结: js执行顺序

    1. 同步
    2. process.nestTick
    3. 事件循环里的微任务(promise.then)
    4. 宏任务(计时器,ajax,读取文件)
    5. setImmediate