欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Es6 之async await

程序员文章站 2023-12-21 22:44:40
...

使用异步方法async await时,在函数前面需要加上async,代表要进行异步操作 await是等待执行

一.基础写法

function loading(num){
        //resolve 接收成功
        //reject 接收失败
        let promise = new Promise((resolve,reject)=>{
        setTimeout(() => {
            if(num<5){
                resolve(`${num}小于5`)      
            }
                reject(`${num}大于5`) 
        }, num*10);
    })
    return promise   //必须要返回
}

async function Fun(){
    let num  = Math.ceil(Math.random()*10); //生成1-10的随机数
    let result = await loading(num).then((val)=>{
        //这里接收loading异步回调中成功的返回
        console.log(val)   //1小于5
        return val

    }).catch((val)=>{
        //这里接收loading异步回调中成错误的返回
        console.log(val)  //9大于5
        return val

    })
    console.log(result)   //这里result是不管是成功还是失败的返回值
    
}
Fun()

//正常情况下,await命令后面是一个 Promise 对象,
//返回该对象的结果。如果不是 Promise 对象,就直接返回对应的值

async function fun(){
    return await "555"
}
fun().then(v=>console.log(v))  //555```


二.传统Promise写法和await写法比较

 function loadingStep(n){
     return new Promise(res=>{    //执行一步方法,并返回结果
         setTimeout(() => {
             res(n+200)   //每次n+200  300+200  500+200 700+200
         }, n);
     })
 }  

 function step1(n) {
    console.log(`step1 with ${n}`);   //n == 300
    return loadingStep(n); //在这里调用loadingStep函数
}

function step2(n) {
    console.log(`step2 with ${n}`);  //n == 500
    return loadingStep(n);
}

function step3(n) {
    console.log(`step3 with ${n}`);  //n == 700
    return loadingStep(n);
}

1.Promise

 let asyncStpe = (()=>{
      let time = 300;
      console.log(time)    //首先执行
      step1(time) //这里执行第一个step1函数
      .then(time2=>step2(time2))    //这里接收第一次执行的loadingStep方法中的返回time2为返回值并在传入step2
      .then(time3=>step3(time3))    //这里接收第二次执行的loadingStep方法中的返回time3为返回值并往下执行
      .then(result =>{  //这里执行的是最后一步
        console.log(`result is ${result}`)
      })

  })
  asyncStpe()

2.async await写法 与上面的写法效果一致

async function asyncStpe(){
     let time = 300;
      console.log(time)    //首先执行
     const time1 = await step1(time)
     const time2 = await step2(time1)
     const result = await step3(time2)
     console.log(`result is ${result}`)
}

  asyncStpe()

输出结果:
300
index.html:23 step1 with 300
index.html:28 step2 with 500
index.html:33 step3 with 700
index.html:44 result is 900

错误处理

如果await后面的异步操作出错,那么等同于async函数返回的 Promise 对象被reject。

    async function f() {
        await new Promise(function(resolve, reject) {
            throw new Error('出错了')
        })
    }
    f().then(v => {
        console.log(e)

    }).catch(e => {
        console.log(`这里抛出${e}`) // 这里抛出Error: 出错了
    })

防止出错的方法,也是将其放在try…catch代码块之中


相关标签: es6 es6

上一篇:

下一篇: