• promise笔记(三)


    aysnc与await

    async函数

    async 函数是使用async关键字声明的函数。 async 函数是AsyncFunction构造函数的实例, 并且其中允许使用await关键字。asyncawait关键字让我们可以用一种更简洁的方式写出基于Promise的异步行为,而无需刻意地链式调用promise。(MDN介绍)

    被async修饰的函数会返回一个promise对象,如:

    1. async function fn1() {
    2. return 2
    3. }
    4. const res = fn1()
    5. console.log(res);
    6. //output:
    7. //promise{:2}

    这里可以看到,fn1返回了一个fulfilled(resolved)的promise对象,且结果值为2。实际上,这里返回的primose状态的规则,可以参考上一节笔记中问题三中的规则,两者是一样的。比如,我在async函数中抛出一个异常,那么函数返回的promise状态就是rejected且结果值为你throw的东西:

    1. async function fn1() {
    2. throw new Error('jesus')
    3. }
    4. const res = fn1()
    5. console.log(res);
    6. //output:
    7. //Promise {: Error: jesus

            那么,async函数是同步还是异步执行的呢?我们写个代码来验证一下:

    1. let a = 1
    2. async function fn1() {
    3. a = 2
    4. }
    5. fn1()
    6. console.log('a:',a);
    7. //output:
    8. //a: 2

            事实证明,async函数是同步执行的,至少目前来看是。

      await 表达式

            await 操作符用于等待一个Promise 对象。它只能在异步函数 async函数中使用。(MDN介绍)基本示例:

    1. function fn1() {
    2. return Promise.resolve(6)
    3. }
    4. async function fn2() {
    5. const val = await fn1()
    6. console.log(val);
    7. }
    8. fn2()
    9. //output:6

       await返回 Promise 对象的处理结果。如果等待的不是 Promise 对象,则返回该值本身。例如:

    1. function fn1() {
    2. return 6
    3. }
    4. async function fn2() {
    5. const val = await fn1()
    6. console.log(val);
    7. }
    8. fn2()
    9. //output:6

    如果Promise对象的处理结果是失败的,那么需要用try...catch进行捕获。例如:

    1. function fn1() {
    2. return Promise.reject(123)
    3. }
    4. async function fn2() {
    5. try {
    6. const val = await fn1()
    7. console.log(val);
    8. } catch (error) {
    9. console.error(error);
    10. }
    11. }
    12. fn2()
    13. //output:123

    await是否会等待Promise对象中的任务执行完?

            会的。看下例代码

    1. async function fn2() {
    2. try {
    3. const val = await new Promise((resolve, reject) => {
    4. setTimeout(() => {
    5. console.log("执行异步任务一");
    6. resolve("data1");
    7. }, 1000);
    8. }).then((val) => {
    9. console.log("任务一结果:", val);
    10. console.log("执行同步任务二");
    11. return "data2";
    12. });
    13. console.log("最终结果:", val);
    14. } catch (error) {
    15. console.error(error);
    16. }
    17. }
    18. fn2();
    19. //output:
    20. //执行异步任务一
    21. //任务一结果: data1
    22. //执行同步任务二
    23. //最终结果: data2

    关于上一节的问题八

            问题八讲的是,如何让promise中的异步任务的结果同步到主线程中。那么在知道了await可以等待promise执行完毕并取出中的值后,我们便可以利用async/await来解决同步到主线程的问题。先看下原来的代码

    1. let a = 1
    2. new Promise((resolve,reject)=>{
    3. setTimeout(() => {
    4. a = 2
    5. resolve(a)
    6. }, 1000);
    7. })
    8. .then(val=>{
    9. console.log('a in then:',val); //为了方便区别哪里的a,加点输出文字
    10. })
    11. console.log('a in main:',a);
    12. //output:
    13. //a in main: 1
    14. //a in then: 2

    我们只需要对new Promise封装一下即可,如下所示:

    1. let a = 1;
    2. async function changeA() {
    3. return new Promise((resolve, reject) => {
    4. setTimeout(() => {
    5. a = 2;
    6. resolve(a);
    7. }, 1000);
    8. });
    9. }
    10. await changeA();
    11. console.log("a in main:", a);
    12. //output: a in main: 2

    但是需要注意的是,如果你是在html文件的script标签里运行这段代码,是会报错的,我们需要给script标签加上type="module"的属性描述即可。

  • 相关阅读:
    Java常问面试题概要答案
    luffy-(12)
    2023-08-31 LeetCode每日一题(一个图中连通三元组的最小度数)
    【MySQL数据库】(三)函数
    搭载AI之后的表格插件又有哪些新的改变
    云计算的openStack 究竟是为了解决什么问题?一句话说清楚
    Spring Tx (九) (Spring 事务源码分析)
    闲谈JVM(一):浅析JVM Heap参数配置
    《Jetpack Compose从入门到实战》 第二章 了解常用UI组件
    Python入门自学进阶-Web框架——42、Web框架了解-bottle、flask
  • 原文地址:https://blog.csdn.net/hlz_12345/article/details/126092263