首页 > 其他分享 >Vue学习笔记(十二)

Vue学习笔记(十二)

时间:2024-10-30 15:20:04浏览次数:5  
标签:Vue const await 十二 笔记 return resolve Promise async

async与await

1. async

  1. async作为一个关键字放到声明函数前面,表示该函数为一个异步任务,不会阻塞后面函数的执行
  2. async函数里如果有异步过程会等待,但async函数本身会马上返回,不会阻塞当前线程。可以简单认为async函数工作在主线程,同步执行,不会阻塞界面渲染;async函数内部由await修饰的异步过程,工作在相应的协程上,会阻塞等待异步任务的完成再返回
  3. async函数返回类型为Promise对象
    async函数会返回一个promise,并且Promise对象的状态值是resolved(成功的)
    如果没有在async函数中写return,那么Promise对象resolve的值就是是undefined
    如果写了return,那么return的值就会作为成功的时候传入的值

这是和普通函数本质上不同的地方,也是使用时重点注意的地方:
1. return new Promise(),这个符合async函数本意
2. return data 这是同步函数的写法,特别注意这其实就相当于Promise.resolve(data);还是一个Promise对象,但在调用async函数的地方通过简单的等号操作(=)是拿不到这个data的,因为返回值是一个Promise对象,所以需要用then(data => { })才可以拿到data
3. 如果没有返回值,相当于返回了Promise.resolve(undefined);

        <script>
            const aa = async () => {
                return 1
                //return Promise.resolve(1)
                // return new Promise((resolve, reject) => {
                // resolve(1)
                // })
            }

            const bb = async () => {
                return Promise.resolve(1)
                // return new Promise((resolve, reject) => {
                // resolve(1)
                // })
            }

            //aa() 返回结果是 Promise对象
            console.log(`output->aa()`,aa())
            //获取异步函数的返回值
            aa().then(res => {
                console.log(`output->res`,res)
            })
        </script>
  1. 无等待
    在没有await的情况下执行async函数,它会立即执行,返回一个Promise对象,并且不会阻塞后面的语句,这和普通返回Promise对象的函数并无二致

2. await

  1. await只能在async函数内部使用:不能放在普通函数里面,否则会报错
  2. await关键字后面跟Promise对象:在Pending状态时,相应的协程会交出控制权,进入等待状态,这是协程的本质
  3. await是async wait的意思: wait的是resolve(data)的消息,并把数据data返回,比如下面代码中,当Promise对象由Pending变为Resolved的时候,变量a就等于data,然后再顺序执行下面的语句console.log(a),这真的是等待,真的是顺序执行,表现和同步代码几乎一模一样
const a = await new Promise((resolve, reject) => {
// async process ...
return resolve(data);
});
console.log(a);
  1. await后面也可以跟同步代码: 不过系统会自动将其转化成一个Promsie对象
const a = await 'hello world'
// 相当于
const a = await Promise.resolve('hello world');
// 跟同步代码是一样的,还不如省事点,直接去掉await关键字
const a = 'hello world';
  1. await对于失败消息的处理: await只关心异步过程成功的消息resolve(data),拿到相应的数据data,至于失败消息reject(error),不关心不处理;对于错误的处理有以下几种方法供选择:
    1. 让await后面的Promise对象自己catch
    2. 也可以让外面的async函数返回的Promise对象统一catch
    3. 像同步代码一样,放在一个try…catch结构中
async function fetchData() {
                // 将异步和同步的代码放在一个try..catch中,异常都能抓到
                try {
                    const array = null;
                    let data = await asyncFn(); // 这里用await关键字,就能拿到结果值;否则,没有await的话,只能拿到Promise对象
                    if (array.length > 0) { // 这里会抛出异常,下面的catch也能抓到
                        array.push(data);
                    }
                } catch (error) {
                    console.log(error);
                }
            }

            document.addEventListener('DOMContentLoaded', fetchData);
  1. await对于结果的处理: await是个运算符,用于组成表达式,await表达式的运算结果取决于它等的东西,如果它等到的不是一个Promise对象,那么await表达式的运算结果就是它等到的东西;如果它等到的是一个Promise对象,await就忙起来了,它会阻塞其后面的代码,等着Promise对象resolve,然后得到resolve的值,作为await表达式的运算结果;虽然是阻塞,但async函数调用并不会造成阻塞,它内部所有的阻塞都被封装在一个Promise对象中异步执行,这也正是await必须用在async函数中的原因

3. 综合案例

<script>
        // 模拟一个异步操作函数
        const myPromise1 = () => {
            return new Promise((resolve, reject) => {
                console.log(`output->创建myPromise1`)
                // 模拟一个异步操作,2秒钟后将结果返回
                setTimeout(() => {
                    const random = Math.random()
                    if (random > 0.5) {
                        resolve(`myPromise1成功`);
                    } else {
                        reject(`myPromise1失败`)
                    }
                }, 2000)
            })
        }
        // 模拟一个异步操作函数
        const myPromise2 = () => {
            return new Promise((resolve, reject) => {
                console.log(`output->创建myPromise2`)
                // 模拟一个异步操作,2秒钟后将结果返回
                setTimeout(() => {
                    const random = Math.random()
                    if (random > 0.5) {
                        resolve(`myPromise2成功`);
                    } else {
                        reject(`myPromise2失败`)
                    }
                }, 2000)
            })
        }
        // 模拟一个异步操作函数
        const myPromise3 = () => {
            return new Promise((resolve, reject) => {
                console.log(`output->创建myPromise3`)
                // 模拟一个异步操作,2秒钟后将结果返回
                setTimeout(() => {
                    const random = Math.random()
                    if (random > 0.5) {
                        resolve(`myPromise3成功`);
                    } else {
                        reject(`myPromise3失败`)
                    }
                }, 2000)
            })
        }
        const myAsync = async () => {
            try {
                console.log(`myAsync开始执行`)
                //await 同步执行代码获取Promise的resolve结果
                const data1 = await myPromise1()
                const data2 = await myPromise2()
                const data3 = await myPromise3()
                return `myAsync执行成功`
            } catch (error) {
                //await 执行出现错误处理(包括Promise的reject结果)
                console.log(`myAsync执行出错:`, error)
            }
        }
        //myAsync函数是async异步的 返回结果是Promise对象
        myAsync().then((res) => {
            console.log(`output->res`, res)
        }).catch((error) => {
            console.log(`output->error`, error)
        })
</script>

标签:Vue,const,await,十二,笔记,return,resolve,Promise,async
From: https://blog.csdn.net/qq_73340809/article/details/143366286

相关文章

  • 笔记本电脑组装及装配行业MES系统解决方案介绍
    一、笔记本电脑组装及装配行业为什么需要上MES系统?随着笔记本电脑市场的不断发展,消费者对产品的质量、性能和定制化需求不断提高,导致生产企业面临越来越多的挑战。笔记本电脑组装及装配行业具有多工序、多部件、多批次的特点,如何确保生产效率、提高产品质量、缩短交货周期成......
  • Vue学习笔记(十一)
    一.Promise1.异步异步:则是将耗时很长的A交付的工作交给系统之后,就去继续做B交付的工作,等到系统完成了前面的工作之后,再通过回调或者事件,继续做A剩下的工作。AB工作的完成顺序,和交付他们的时间顺序无关,所以叫“异步”。2.回调函数当一个函数作为参数传入另一个函数中,......
  • 【笔记】【Android】Manifest中的intent-filter使用
    【笔记】【Android】Manifest中的intent-filter使用笔记系列,内容是从网络搜索的结果,不一定是正确的理解。如果存在谬误,欢迎大家指正。intent-filter是为了标明Activity,Service或者BraodcastReceiver可以相应的intent类型。基本结构<activityandroid:name=".YourActivity"......
  • (开题报告)django+vue同城搬家管理系统论文+源码
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景关于同城搬家管理系统的研究,现有研究主要以传统的搬家服务运营模式为主,专门针对借助django+vue技术构建同城搬家管理系统的研究较少。在......
  • 基于node.js+vue基于Android的在线招聘平台的设计与实现(开题+程序+论文)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于在线招聘平台的研究,现有研究主要集中在PC端和Web端,如基于B/S架构的在线招聘平台,实现了用户注册、职位发布、简历投递、面试安排等功能12。然而,专门......
  • 基于node.js+vue基于B_S的商务酒店网上预订管理系统(开题+程序+论文)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于商务酒店网上预订系统的研究,现有研究主要集中在大型连锁酒店的预订系统,如Expedia、Booking.com等,这些系统通常采用C/S(客户端/服务器)架构,提供丰富的......
  • 001 vue.config相关
    constproxyURL=require("./src/common/proxy-config").proxyURL;constbaseURL=require('./src/common/proxy-config').baseURL;constpath=require('path');functionresolve(dir){returnpath.join(__dirname,dir);}module.ex......
  • 算法学习笔记5: 排序算法
    排序算法归并排序时间复杂度O(nlogn)空间复杂度O(n),稳定排序就是给定两个有序数组,将两个数组合并在一起升序。定义一个更大的数组,给定两个指针分别指向两个数组,每次取较小值放入新数组。voidmergeSort(inta[],intl,intr){ if(l>=r)return; intmid=l+r>>1;......
  • 算法学习笔记6: 字符串
    字符串字符串哈希通过求解字符串前缀的哈希值的方式,可以比较字符串内任意字串的相等情况。首先需要把每个字符映射成数字,是什么无所谓(因为字符不好计算哈希值呀),然后类似于计算前缀和的方式,这里是计算h[i]表示前i个字符的哈希值。然后把要计算的每个前缀字符串看作是一个P......
  • 【笔记】【Android】Activity的Task模式
    【笔记】【Android】Activity的Task模式笔记系列,内容是从网络搜索的结果,不一定是正确的理解。如果存在谬误,欢迎大家指正。Task一个应用可能会包含多个Activity,管理这些Activity顺序的容器,就是Task。当Activity1拉起Activity2时,Task会将Activity2压栈,将显示Activity2的内容。......