ES6中Promise、async和await面试题整理

时间:2024-12-19 21:27:07

 ???? 个人简介:某大型国企资深软件开发工程师信息系统项目管理师、****优质创作者、阿里云专家博主、华为云云享专家,分享前端后端相关技术与工作常见问题~

???? 作    者:码喽的自我修养❣️
???? 专    栏:vue2/3 从基础到起飞

???? 若有帮助,还请 关注➕点赞➕收藏  ,不行的话我再努努力????????????

promise是每个前端人必须会接触到的一个知识点,下面这篇文章主要给大家整理了一下关于ES6中Promise、async和await面试题的相关资料,文中通过实例代码介绍得非常详细,需要的朋友可以参考下,创作不易,如果能帮助到带大家,欢迎收藏+关注 哦 ????

????????文章目录

出题目的

主要涉及知识点

代码示例

考点1:、执行顺序

考点2:then 和 catch 内部没有 throw new Error() 相当于 resolve

考点3:async function -> 相当于返回一个

考点4: await 代码执行顺序

考点5:Promise 与 setTimeout 执行顺序

附:promise与async await结合使用


出题目的

  • 考察 Promise、async、await 的基础
  • 考察队Event Loop、宏任务、微任务的理解

主要涉及知识点

  • JS 执行顺序:单线程,自上而下、先同步后异步、先微任务后宏任务
  • new promise() -> (),触发then
  • new promise((reject)=>{reject()}) -> (),触发catch
  • then 和 catch 内部没有 throw new Error 相当于 resolve
  • async function 相当于返回 ()
  • await 后面的代码都是异步的,微任务;setTimeout是宏任务
  • 初始化Promise时,函数内部代码会被立即执行

代码示例

考点1:、执行顺序

  1. Promise.resolve().then(() => { // 优先寻找then
  2. console.log(1);
  3. }).catch(() => {
  4. console.log(2);
  5. })
  6. // 1
'
运行

考点2:then 和 catch 内部没有 throw new Error() 相当于 resolve

  1. Promise.resolve().then(() => {
  2. console.log(1);
  3. }).catch(() => {
  4. console.log(2);
  5. }).then(() => {
  6. console.log(3);
  7. })
  8. // 1 3
'
运行
  1. Promise.reject().then(() => {
  2. console.log(1);
  3. }).catch(() => {
  4. console.log(2);
  5. }).then(() => {
  6. console.log(3);
  7. })
  8. // 2 3
'
运行
  1. Promise.reject().then(() => {
  2. console.log(1);
  3. }).catch(() => {
  4. console.log(2);
  5. throw new Error();
  6. }).then(() => {
  7. console.log(3);
  8. })
  9. // 2 报错
  1. Promise.reject().then(() => {
  2. console.log(1);
  3. }).catch(() => {
  4. console.log(2);
  5. throw new Error();
  6. }).then(() => {
  7. console.log(3);
  8. }).catch(() => {
  9. console.log(4);
  10. })
  11. // 2 4
'
运行

考点3:async function -> 相当于返回一个

  1. const res = async function fn() {
  2. return 100;
  3. }
  4. console.log(res()); // 返回一个resolve状态的Promise对象 Promise {<fulfilled>: 100}
  5. res().then(()=>{
  6. console.log(0);
  7. }).catch(()=>{
  8. console.log(1);
  9. })
  10. // 0
  11. (async function () {
  12. const a = fn();
  13. const b = await fn();
  14. console.log(a); // Promise {<fulfilled>: 100}
  15. console.log(b); // 100
  16. })()

考点4: await 代码执行顺序

  1. async function fn1() {
  2. console.log("fn1 start");
  3. await fn2();
  4. console.log("fn1 end");
  5. }
  6. async function fn2() {
  7. console.log("fn2 start");
  8. }
  9. console.log("start");
  10. fn1();
  11. console.log("end");
  12. /**
  13. * 打印顺序:
  14. * start
  15. * fn1 start
  16. * fn2 start
  17. * end
  18. * fn1 end
  19. */
'
运行
  1. async function fn1() {
  2. console.log("fn1 start");
  3. await fn2();
  4. console.log("fn1 end");
  5. await fn3();
  6. console.log("fn3 end");
  7. }
  8. async function fn2() {
  9. console.log("fn2");
  10. }
  11. async function fn3() {
  12. console.log("fn3");
  13. }
  14. console.log("start");
  15. fn1();
  16. console.log("end");
  17. /**
  18. * 打印顺序:
  19. * start
  20. * fn1 start
  21. * fn2
  22. * end
  23. * fn1 end
  24. * fn3
  25. * fn3 end
  26. */
'
运行
  1. async function fn1() {
  2. console.log("fn1 start");
  3. await fn2();
  4. console.log("fn1 end");
  5. await fn3();
  6. console.log("fn3 end");
  7. }
  8. async function fn2() {
  9. console.log("fn2");
  10. }
  11. async function fn3() {
  12. console.log("fn3");
  13. }
  14. console.log("start");
  15. fn1();
  16. console.log("end");
  17. /**
  18. * 打印顺序:
  19. * start
  20. * fn1 start
  21. * fn2
  22. * end
  23. * fn1 end
  24. * fn3
  25. * fn3 end
  26. */
'
运行

考点5:Promise 与 setTimeout 执行顺序

  1. console.log("start");
  2. setTimeout(()=>{
  3. console.log("setTimeout")
  4. });
  5. Promise.resolve().then(()=>{
  6. console.log("Promise")
  7. })
  8. console.log("end")
  9. /**
  10. * 打印顺序:
  11. * start
  12. * end
  13. * Promise
  14. * setTimeout
  15. */
'
运行

附:promise与async await结合使用

昨天看了一道字节外包的面试题

  1.  const list = [1, 2, 3];
  2.     const square = num => {
  3.         return new Promise((resolve, reject) => {
  4.             setTimeout(() => {
  5.                 resolve(num * num);
  6.             }, 1000);
  7.         });
  8.     }
  9.     function test() {
  10.         // 修改这里的代码
  11.         list.forEach(async x => {
  12.             const res = await square(x);
  13.             console.log(res);
  14.         });
  15.     }
  16.     test()
'
运行

需要修改的是把同步执行的数组替换成换成异步打印。

在测试以后我们可以-验证,forEach和for循环不同的是for循环可以修改数组的值,且forEach取不到具体某一项的值,这里的异步说的是每执行一次数组循环,就执行一步test()方法

  1. const list = [1, 2, 3];
  2. const square = num => {
  3.     return new Promise((resolve, reject) => {
  4.         setTimeout(() => {
  5.             resolve(num * num);
  6.         }, 1000);
  7.     });
  8. }
  9.  function test() {
  10.   for(let x of list) {
  11.     var res = await square(x)
  12.     console.log(res)
  13.   }
  14. }
  15. test()

 好了,本文就到这里吧,点个关注 再走嘛~

  更多专栏订阅推荐:

???? JavaScript深入研究

???? 前端工程搭建
???? javaScript基础

✈️ HTML5与CSS3

⭐️ uniapp与微信小程序

???? 前端工作常见问题汇总

✍️ GIS地图与大数据可视化

???? 常用组件库与实用工具