微信小程序学习总结(async,await)

1,async,await和promise

首先是async和await,async和await是async和await两部分组成,async是异步的意思,而await是async wait的简写,所以async用于声名function是一个异步的,await用于等待异步方法执行

  • async:
    async是加在一个function之前的,它的作用是将function变为异步的操作,而这个异步操作的返回值是一个promise对象
async function a1 (){
            return "a1"
        }
        const result = a1()
        console.log(result)
//打印结果
Promise {<fulfilled>: "a1"}
__proto__:Promise
		[[PromiseStatus]]: "fulfilled"
         [[PromiseValue]]: "a1"

所以当写上了async在函数之前时 函数内部return 一个直接量的话,async会直接返回一个promise实例

所以直接调用这个a1()方法配合.then方法来拿到a1中return的内容

async function a1 (){
            return "a1"
        }
        const result = a1()
        a1().then(res=>{
            console.log(res) //输出的"a1"
        })

让我们再来看一下promise a1()的返回值如果是一个普通的promise对象时

function a1 (){
            return new Promise((reslove,reject)=>{
                reslove("a1")
            })
        }
        const result = a1()
        a1().then(res=>{
            console.log(res) //输出的"a1"
        })

可见 确实 是与普通的promise对象无异

但是如果 async中没有返回值 会是什么样子的

async function a1 (){
            console.log(1)
        }
        const result = a1()
        a1().then(res=>{
            console.log(res) //输出的"underfind"
        })

可见的是它会返回一个undefined,这时候想一下promise的特点是无需等待 所以在没有await的方法下 他会立即执行 返回promise对象 不会阻塞后部分的语句 于普通promise无异样

所以,现在让我们来看关键字await

  • await:
    上边说到await是等async的 他是等async的完成 等的是一个表达式 表达式的结果是promise对象或者其他值
    以为async函数返回一个promise对象 所以await可以用来等待一个async函数的返回值,这也可以说awite是在等待async函数,要记住的是他等待的数一个返回值 ,await不仅仅用来等待promise对象他可以等任何表达式的结果 所以 await后面可以接普通的函数调用或者直接量
function a1 (){
            return "a1"
        }
        async function a2(){
            return Promise.resolve("a2")
        }
        async function ok(){
            const v1 = await a1()
            const v2 = await a2()
            console.log(v1,v2)
        }
        ok()

当await等到了他要等的东西

如果这个东西不是一个promise对象 那么awai表达式结果就是他等到的东西

如果等到的是promise对象的话await就会忙起来 他会阻塞后面的代码 等着promise 的返回值然后得到resolve的值中作为await表达式返回结果

注意:因为await会阻塞代码 所以 await会和async一起使用才可以不然浏览器会报错

  • 了解async和await帮我们做了什么
    上面说了async会返回一个promise对象 而awite会等待这个async的promise完成 并将reslove的结果返回出来
    模拟:先不用async和await
function a1(){
            return new Promise((resolve,reject)=>{
                setTimeout(() => resolve("a1"), 1000);
            })
        }
        a1().then(res=>{
            console.log("这个是a1:",res)
        })
        //结果是隔了一秒钟 控制台打印“ 这个是a1: a1 ”

接下来 用上async和await

function a1(){
            return new Promise((resolve,reject)=>{
                setTimeout(() => resolve("a1"), 1000);
            })
        }
        async function test(){
            const v = await a1()
            console.log("这个是a1":v)
        }
        test()
  //结果是隔了一秒钟 控制台打印"这个是a1: a1"

两种方法的结果可以明显看到 并没有太大差异 而且 async/awaite还要多了几行代码

  • async/awaite的优势是什么
    async/awaite的优势在于处理.then链
function addtime(n) {
            return new Promise(resolve => {
                setTimeout(() => resolve(n + 200), n);
            })
        }
        function a1 (n){
            console.log("步骤1:::",n)
            return addtime(n)
        }
        function a2(n){
            console.log("步骤2:::",n)
            return addtime(n)
        }
        function a3(n){
            console.log("步骤3:::",n)
            return addtime(n)
        }
        function start(){
            console.time("start")
            const time1 = 300
            a1(time1).then(time2=>a2(time2)).then(time3=>a3(time3)).then(result=>{
                console.log("结果是:::",result)
                console.timeEnd("start")
            })
        }
        start()
        //返回值
         步骤1::: 300
 		步骤2::: 500
 		步骤3::: 700
		结果是::: 900
 		start: 1505.947998046875ms

上面这个是利用.then处理的

下面来用async/await来处理

function addtime(n) {
            return new Promise(resolve => {
                setTimeout(() => resolve(n + 200), n);
            })
        }
        function a1 (n){
            console.log("步骤1:::",n)
            return addtime(n)
        }
        function a2(n){
            console.log("步骤2:::",n)
            return addtime(n)
        }
        function a3(n){
            console.log("步骤3:::",n)
            return addtime(n)
        }
        async function start(){
            console.time("start")
            const time1 = 300
            const time2 = await a1(time1)
            const time3 = await a2(time2)
            const result = await a3(time3)
            console.log("结果是:::",result)
            console.timeEnd("start")
        }
        start()
        //结果:
        test.html:18 步骤1::: 300
  	    步骤2::: 500
 	    步骤3::: 700
  	    结果是::: 900
 	    start: 1505.614990234375ms

结果可见 于 promise还是一样的 但是代码的看着特别清晰

  • 更有趣的
    改下上面案例的业务需求 还是三个步骤 每个步骤 结束都加上一个步骤结果
    先用async/awaite来写
function addtime(n) {
            return new Promise(resolve => {
                setTimeout(() => resolve(n + 200), n);
            })
        }
        function a1 (n){
            console.log("步骤1:::",n)
            return addtime(n)
        }
        function a2(m,n){
            console.log("步骤2:::",m,n)
            return addtime(m+n)
        }
        function a3(k,m,n){
            console.log("步骤3:::",k,m,n)
            return addtime(k+m+n)
        }
        async function start(){
            console.time("start")
            const time1 = 300
            const time2 = await a1(time1)
            const time3 = await a2(time1,time2)
            const result = await a3(time1,time2,time3)
            console.log("结果是:::",result)
            console.timeEnd("start")
        }
        start()
        //结果 步骤1::: 300
 			步骤2::: 300 500
			 步骤3::: 300 500 1000
			结果是::: 2000
			:36 start: 2906.759033203125ms

用promise来写

function addtime(n) {
            return new Promise(resolve => {
                setTimeout(() => resolve(n + 200), n);
            })
        }
        function a1(n) {
            console.log("步骤1:::", n)
            return addtime(n)
        }
        function a2(m, n) {
            console.log("步骤2:::", m, n)
            return addtime(m + n)
        }
        function a3(k, m, n) {
            console.log("步骤3:::", k, m, n)
            return addtime(k + m + n)
        }
        async function start() {
            console.time("start")
            const time1 = 300
            a1(time1).then(time2 => {
                return a2(time1, time2).then(time3 => [time1, time2, time3])
            }).then(times => {
                const [time1, time2, time3] = times
                return a3(time1, time2, time3)
            }).then(result => {
                console.log("结果是:::", result)
                console.timeEnd("start")
            })

        }
        start()
        //结果:
        步骤1::: 300
 		步骤2::: 300 500
 		步骤3::: 300 500 1000
 		结果是::: 2000
 		start: 2907.22705078125ms

结果也是差不多的 但是 promise传参麻烦 这里就体现了 async/await的好处了

  • 本文参考:
  • 自己照着打了一遍 每个代码 自己实现了 一遍还是不太理解 还需要 继续钻研和学习