ES6-Promise的基本用法,async和await的基本用法

ES6-Promise的基本用法

1.回调地狱

  • 回调地狱: 因为js是单线程的, 有些时候为了代码功能需求,需要函数嵌套函数,当函数嵌套多层时,就会形成回调地狱
//里面函数嵌套函数时
function fun() {
    
    
            setTimeout(function() {
    
    
                console.log(2);
                setTimeout(function() {
    
    
                    console.log(1);
                    setTimeout(function() {
    
    
                        console.log(3);
                    })
                })

            })
        }

通过Promise方法解决回调地狱

2.什么是Promise

Promise() 是一个对象:
它有三种形态:
1、pending 进行中
2、resolve 成功执行
3、reject 失败执行

  • 当状态改变时,智能从pending转换成resolve或者从pending转换成reject;如果处于pending状态,永远不知道下一步转换成什么状态
  • Promise() 接收一个函数作为参数; 函数存在两个参数(这两个参数是js原生提供的) 一个是resolve, 一个是reject

Promise()的执行机制:

如果Promise()执行成功,则会调用执行 resolve(); resolve()中的参数就是执行成功的结果,通过then() 进行接受, then() 参数是一个函数,函数的参数就是 resolve传递传递出来的数据

如果Promise()执行失败, 则会调用执行 reject(); reject()中的参数就是执行失败的错误信息, 通过 catch()进行接受, catch的参数一个函数。 函数的参数 err 就是reject 传递出来的错误信息

3.用Promise解决上面1函数嵌套的问题

 //  使用Promise() 解决
        function fun1() {
    
    
        //1.先创建一个promise对象
            return new Promise((resolve, reject) => {
    
    
                setTimeout(() => {
    
    
                    //  then()
                    console.log('输出1');
                    //2.resolve 输出成功的状态
                    resolve()
                }, 1000)
            })
        }
        function fun2() {
    
    
            return new Promise((resolve, reject) => {
    
    
                setTimeout(() => {
    
    
                    //  then()
                    console.log('输出2');
                    resolve()
                }, 2000)
            })
        }
        function fun3() {
    
    
            return new Promise((resolve, reject) => {
    
    
                setTimeout(function () {
    
    
                    console.log('setTimeout3');
                    resolve();
                }, 2000)
            })
        }
         //通过then先调用fun2,再把fun2的结果返回,给fun1用,在把fun1的结果返回给fun3用   所以输出的结果为  2 3 1
        //  链式写法 
        fun2().then(fun1).then(fun3).then(() => {
    
    
            console.log('promise 执行全部结束');
        })

在这里插入图片描述

js中的try-catch语句

格式为:

第一种写法:
	try{
    
    
		//测试的代码
	}catch{
    
    
		//代码的异常捕获(错误提示)
	}
第二种写法:
	try{
    
    
		//测试的代码
	}catch(err){
    
    
		//代码的异常捕获(错误提示)
	}

catch后面还有一个语句
	try{
    
    
            // 代码测试
        }catch{
    
    
            // 异常捕获 
        }finally{
    
    
            // finally 使用较少
           // 无论代码是否出错,此处的代码始终执行 
        }

【注意】如果需要输出错误的信息,catch后面需要跟()并且需要传入一个参数err (就是错误信息),如果不需要输出错误信息,catch后不需要跟()

在这里插入图片描述

Promise的all方法

当有多个Ajax请求的时候,如何判断多个请求是否运行结束呢?
Promise.all方法就可以解决这个问题

 <script>
        function fun1() {
    
    
            return new Promise((resolve, reject) => {
    
    
                setTimeout(() => {
    
    
                    console.log("setTimeout1");
                    resolve("setTimeout1执行成功")
                        // reject("1执行失败")
                }, 1000)
            })
        }

        function fun2() {
    
    
            return new Promise((resolve, reject) => {
    
    
                setTimeout(() => {
    
    
                    console.log("setTimeout2");
                    resolve("setTimeout2执行成功")
                        // reject("2执行失败")
                }, 1500)
            })
        }

        function fun3() {
    
    
            return new Promise((resolve, reject) => {
    
    
                setTimeout(() => {
    
    
                    console.log("setTimeout3");
                    resolve("setTimeout3执行成功")
                        // reject("1执行失败")
                }, 2000)
            })
        }
        const c = Promise.all([fun1(), fun2(), fun3()]);
        console.log(c);
        c.then((data) => {
    
    
            console.log(data);
        }).catch((err) => {
    
    
            console.log(err);
        })
    </script>
  • Promise.all() 参数是一个数组, 数组中的每个值都是Ppromise()的实例对象,

  • 上面的案例中 c 的状态 有 fun1(), fun2(), fun3() 决定,只有fun1(), fun2(), fun3() 都是成功,则 p的 状态是 成功 fulfilled (resolve); 如果 fun1(), fun2(), fun3() 存在一个失败,则 c的状态 是失败rejected

  • then()方法的回调函数的参数 是 所有 Promise()实例执行成功时传递的数据,自动把所有的数据放到一个数组中
    在这里插入图片描述
    在这里插入图片描述

Promise的race方法

Promise.race() 方法 的参数是一个数组, 数组中的每个值是 Promise() 实例对象; 最后返回一个新的Promise() 对象

状态 改变: fun1(), fun2(), fun3() 三个实例对象 谁的状态先改变(不管成功还是失败),则p的状态都会随之跟随改变 如果fun1(), fun2(), fun3() 三个实例对象 先改变的状态是成功,则成功,如果失败则失败

//	1的状态是失败的,所以都是失败
 function fun1() {
    
    
            return new Promise((resolve, reject) => {
    
    
                setTimeout(() => {
    
    
                    console.log('setTimeout1');
                    // resolve('setTimeout1 的 data');
                    reject('setTimeout1 第一个失败');
                }, 1000)
            })
        }

        function fun2() {
    
    
            return new Promise((resolve, reject) => {
    
    
                setTimeout(() => {
    
    
                    console.log('setTimeout2');
                    resolve('setTimeout2 的 data2');
                    // reject('setTimeout2 的 失败');
                }, 1500)
            })
        }

        function fun3() {
    
    
            return new Promise((resolve, reject) => {
    
    
                setTimeout(() => {
    
    
                    console.log('setTimeout3');
                    resolve('setTimeout3 的 data3');
                    // reject('setTimeout3 失败了');
                }, 2000)
            })
        }
        //  Promise.race() 方法 的参数是一个数组, 数组中的每个值是 Promise() 实例对象; 最后返回一个新的Promise() 对象
        //  状态 改变: fun1(), fun2(), fun3() 三个实例对象 谁的状态先改变(不管成功还是失败),则p的状态都会随之跟随改变   如果fun1(), fun2(), fun3() 三个实例对象 先改变的状态是成功,则成功,如果失败则失败
        //  
        const p = Promise.race([fun1(), fun2(), fun3()]);
        p.then(res => {
    
    
            console.log(res);
        }).catch(err => {
    
    
            console.log(err);

        })

async和await的基本用法

回调地狱: 通过 Promise() 解决

Promise() 解决回调地狱会产生一个新的问题: 就是 Promise()的链式调用问题

什么是async

async 函数 是一个异步操作, 返回的是一个Promise()对象

await 等待 ; 在 async函数中使用 通常情况下 await 后是一个Promise()对象, 如果不是,会自动转换为Promise()对象形式
Promise.resolve(100) 把数据传递出去

async 和 await 结合使用 可以把异步的操作以同步的形式展示

   async function fun() {
    
    
            console.log(1);
            //await后面 可以是一个函数,也可以是一个具体的值,也可以是promise对象
            let res = await fun2();
            await fun3()
            let res2 = await 2000;
            let res3 = await new Promise(function(resolve, reject) {
    
    
                resolve('这是Promise对象')
            })
            return "hello" + res + res2 + res3;
        }
        async function fun2() {
    
    
            console.log(2);
            return "world"
        }
        async function fun3() {
    
    
            console.log(3);
            return "四大方法法国"
        }
        fun().then(res => {
    
    
            console.log(res);
        });

猜你喜欢

转载自blog.csdn.net/weixin_53125457/article/details/114837212
今日推荐