Promise

406 阅读2分钟

Promise

Promise到底是做什么的呢?

Promise是异步编程的一种解决方案

什么情况下会用到Promise?

一般情况下进行异步操作时,你用Promise对这个异步操作进行封装

Promise执行过程

1.new -> 构造函数(1.保存了一些状态信息 2.执行传入的函数)
2.在执行传入的回调函数时,会传入两个参数,resolve,reject,本身又是函数
3.resolve() ->这个函数代表成功的会掉。会被.then捕获到
4.reject() ->这个函数代表失败的回调。会被.catch捕获到
new Promise((resolve, reject) => {  //伪代码
            //发送请求
            $.ajax({
                type: "GET",
                url: "xxx",
                success: (data) => {
                    resolve(data)
                }
            })
        }).then((data) => {
            console.log(data)
        })

Promise三种状态

首先, 当我们开发中有异步操作时, 就可以给异步操作包装一个Promise

异步操作之后会有三种状态

● pending:等待状态,比如正在进行网络请求,或者定时器没有到时间。
● fulfill:满足状态,当我们主动回调了resolve时,就处于该状态,并且会回调.then()
● reject:拒绝状态,当我们主动回调了reject时,就处于该状态,并且会回调.catch()

小练习:Promise的链式调用

第一种:

 new Promise((resolve, rej) => {
            setTimeout(() => {
                resolve("aaa")
            }, 1000)
        }).then((res) => {
            console.log(res, '第一层')

            return new Promise((resolve) => {
                resolve(res + '111')
            })
        }).then((res) => {
            console.log(res, '第二层')
            return new Promise((resolve) => {
                resolve(res + '222')
            })
        }).then((res) => {
            console.log(res, '第三层')
        })

第二种:使用Promise.resolve

 new Promise((resolve) => {
            setTimeout(() => {
                resolve('aaa')
            }, 1000)
        }).then((res) => {
            console.log(res, '第一层')

            return Promise.resolve(res + '111') //调用Promise.resolve,里面传递res参数就可以了
        }).then((res) => {
            console.log(res, '第二层')
            return Promise.resolve(res + '222')
        }).then((res) => {
            console.log(res, '第三层')
        })

第三种,省略Promise.resolve

 new Promise((resolve) => {
            setTimeout(() => {
                resolve('aaa')
            })
        }).then(res => {
            console.log(res, '第一层')
            return res + '111'  //省略掉Promise.resolve,直接返回结果,它会在里面包装一层Promise
        }).then(res => {
            console.log(res, '第二层')
            return res + '222'
        }).then(res => {
            console.log(res, '第三层')
        })

Promise.all

一起发送请求

let p1 = new Promise((resolve) => {
            setTimeout(() => {  //模拟请求
                resolve('这是第一个请求的')
            }, 1000)
        })
        let p2 = new Promise((resolve) => {
            setTimeout(() => {
                resolve('这是第二个请求的')
            }, 2000)
        })

        Promise.all([p1, p2]).then(results => {
            console.log(results[0]) //这是第一个请求的
            console.log(results[1]) //这是第二个请求的

        })