ES6中Promise、async&await从入门到精通!

1、Promise 对象

①:Promise可以看作为一个容器,容器内部装着未来才会结束的异步操作;

②:Promise用于三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败);

③:状态一旦开始,只有两种可能:从 pending 变为 fulfilled 和从 pending 变为 rejected,且只会有一个最终结果;

④:Promise对象是一个构造函数,用来生成Promise实例,接受一个携带两种处理状态的回调函数(resolve、resject);

2、Promise 基础使用

    var Promise_1 = new Promise((resolve, reject) => {
        //异步操作
        setTimeout(() => {
            let Data = true //判断条件
            if (Data) {
                resolve('异步执行成功!') //操作成功
            } else {
                reject('异步执行失败!') //操作失败
            }
        }, 1000)
    })

    Promise_1.then(res => { //then接收成功状态
        console.log(res)
    }).catch(error => { //catch捕获异常
        console.error(error)
    })

 

使用字面量接收Promise返回值、new关键字创建Promise实例,实例接收一个回调函数,携带resolve、reject两个方法;

实例生成之后可以使用.then()/.catch()方法接收Promise的状态返回值;

上述代码、Promise实例新建成功之后立即执行,判断条件Data为true,所以调用resolve方法,然后then方法指定的回调函

数,将在当前脚本所有同步任务执行完才会执行,所以输出结果为 ‘异步执行成功!’。

3、Promise 链式调用

    var Promise_1 = new Promise((resolve, reject) => {
        //异步操作
        setTimeout(() => {
            let Data = true //判断条件
            if (Data) {
                resolve('异步执行成功!') //操作成功
            } else {
                reject('异步执行失败!') //操作失败
            }
        }, 1000)
    })

    Promise_1.then(res => { //then接收成功状态
        console.log(res)
        return res + '链式调用1'
    }).then(res => {
        console.log(res) //异步执行成功!链式调用1
    })

所谓链式调用,就是可以一直then下去,假设我们第一次拿到的数据需要再次异步处理之后才可以继续使用,那么就需要链

式调用,很简单 只需要在上一次then中返回当前数据即可。

4、Promise 同时执行

应用场景:假设需要同时获取百度地图、网易新闻、哔哩哔哩三个网站开放数据,此时我们就需要发送三个不同的异步请求

来获取数据,怎么办呢? Promise.all( )很好的解决了这个需求。

    var baidu = new Promise((resolve, reject) => {
        setTimeout(() => { resolve('百度数据')}, 1000)
    })
    var wnagyi = new Promise((resolve, reject) => {
        setTimeout(() => { resolve('网易数据')}, 2000)
    })
    var bili = new Promise((resolve, reject) => {
        setTimeout(() => { resolve('哔哩哔哩数据')}, 500)
    })
    Promise.all([baidu, wnagyi, bili]).then(res => {
        console.log(res) //["百度数据", "网易数据", "哔哩哔哩数据"]
    }).catch(err => {
        console.error(err) //捕获异常
    })

 需要注意的是Promise.all()实参是所有Promise实例的字面量组成的数组,执行完毕的结果是所有输出结果的所组成的数

组;

 5、async / await 

首先了解async干了什么事情?我们先写段简单代码,看看async的函数返回值究竟是什么?

    async function testAsync() {
        return 'hello async'
    }

    console.log(testAsync()) //输出 Promise对象

看到输出就恍然大悟了——输出的是一个 Promise 对象。

如果需要拿到 testAsync函数的返回值我们只需要使用Promise原型上的.then()方法即可;因为如果在函数中 return 一个直接量,

async 会把这个直接量通过 Promise.resolve() 封装成 Promise 对象;

    async function testAsync() {
        return 'hello async'
    }

    testAsync().then(res => {
        console.log(res) //输出 hello async
    })

一般来说,都认为 await 是在等待一个带有 async 的函数执行完毕。不过按语法说明await 等待的是一个表达式,这个表达式的计算结果是 Promise 对象或者其它值。

因为 async 函数返回一个 Promise 对象,所以 await 可以用于等待一个 async 函数的返回值——这也可以说是 await 在等 async 函数,但要清楚,它等的实际是一个返回值。要注意它可以等任意表达式的结果,所以,await 后面实际是可以接普通函数调用或者直接量的。所以下面这个示例完全可以正确运行:

    function testAsync() { //只有返回值、没有返回Promise的函数
        return 'hello async'
    }

    function testPromise() { //返回Promise的函数
        return new Promise(resolve => {
            resolve('hello Promise')
        })
    }

    async function test() {
        var Async_1 = await testAsync()
        var Promise_1 = await testPromise().then()
        console.log(Async_1) //输出 hello async
        console.log(Promise_1) //输出 hello Promise
    }
    test() //执行

由上可知,只要await的函数有了返回值即走下一个await!


如果我的博客帮助你解决了开发问题,请不要吝啬你的小红心哦!


● 若有错误欢迎指出、及时修正 ●

发布了18 篇原创文章 · 获赞 91 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43471802/article/details/104943974