async/await相关

86 阅读3分钟

一、什么是async/await?

async/await是基于Promise实现的。

async/await使得异步代码看起来像同步代码。

以前的方法有回调函数和Promise, async/await是写异步代码的新方式。

二、async/await语法

async函数返回一个 Promise 对象,可以使用then 方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到触发的异步操作完成,再接着执行函数体内后面的语句。示例:
const timeout= time => {

    return new Promise(function (resolve, reject) {

        setTimeout(function () {

            resolve();

        }, time);

    })

};

const start = async () => {

    // 在这里使用起来就像同步代码那样直观

    console.log('start');

    await timeout(5000);

    console.log('end');

    return "juejin"

};

start().then(()=> {

    console.log('test....')

});

执行上面的代码,控制台先输出start,稍等5秒后,输出了end,接着输出test..。如下图所示:

1.png

三、注意事项

1、await命令只能用在async函数之中,如果用在普通函数,就会报错。示例:

const timeout = time => {

    return new Promise(function (resolve, reject) {

        setTimeout(function () {

            resolve();

        }, time);

    })

};

function fn() {

    await timeout(500)

}

fn()

执行上面的代码,由于在普通函数fn中使用了await,控制台出现报错,如下图所示:

2.png

将fn改为async函数就不会报错,示例:

const timeout = time => {

    return new Promise(function (resolve, reject) {

        setTimeout(function () {

            resolve();

        }, time);

    })

};

async function fn() {

    await timeout(500)

}

fn()

2、await 后面跟着是一个Promise对象,会等待Promise返回结果了,再继续执行后面的代码。示例:

const timeout = time => {

    return new Promise(function (resolve, reject) {

        setTimeout(function () {

            console.log('juejin')

            resolve();

 

        }, time);

    })

};

const start = async () => {

    await timeout(5000);

    console.log('end');

};

start()

执行上面的代码,控制台等待3秒后,输出juejin,然后才输出后面的console.log语句中的end,如下图所示:

3.png

3、 await后面跟着的是一个数值或者字符串等数据类型的值,则直接返回该值

const num = 2

const str = "juejin"

const arr = [4,6]

const start = async () => {

    console.log(await num)

     console.log(await str)

     console.log(await arr)

};

start()

执行上面的代码,控制台依次输出数字1,字符串juejin和数组[4,6]。如下图所示:

33.png

4、await后面跟着的是定时器,不会等待定时器里面的代码执行完,而是直接执行后面的代码,然后再执行定时器中的代码。示例:

const start = async () => {

    console.log(1)

    await setTimeout(() => {

        console.log(2)

    }, 1000);

    console.log(3);

};

start()

执行上面的代码,控制台依次输出1,3,隔一秒后输出2。如下图所示:

4.png

四、错误捕获

可以直接用标准的try catch语法捕捉错误,示例:

const timeout = time => {

    return new Promise(function (resolve, reject) {

        setTimeout(function () {

           // 模拟出错了,返回 ‘error’

            reject('error');

        }, time);

    })

};

const start = async () =>{

   try {

        console.log('start');

        await timeout(3000); // 这里得到了一个返回错误

        // 因此以下代码不会被执行了

        console.log('end');

    } catch (err) {

        console.log(err); // 这里捕捉到错误 `error`

    }

};

start()

执行上面的代码,控制台先输出start, await等待调用timeout方法返回的Promise对象返回了一个错误,那么后面的代码就不会执行了,直接进入catch,捕捉到错误,在控制台输出error。如下图所示:

5.png

总结结束啦。

今日寄语:

只要你勇敢地说出再见,生活一定会赐予你一个新的开始。