ES6 promise的用法总结

Posted 哪 吒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES6 promise的用法总结相关的知识,希望对你有一定的参考价值。

目录

一、什么是Promise?

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

异步编程,通俗的解释就是,我们封装一个网络请求的函数,因为不能立刻返回结果,所以我们可以将其传入另外一个函数,在数据请求成功时,将数据通过传入的函数回调回去。
但是,如果网络请求比较复杂的时候,就会出现网络地狱的问题。

2、什么是回调地狱?

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
            //1.使用setTimeout
            setTimeout(() => 
                console.log('hello 哪吒编程')
            ,1000)

            //2.使用promise进行异步操作
            new Promise((resolve, reject) => 
                setTimeout(() => 
                    console.log('hello 哪吒编程')
                    console.log('hello 哪吒编程')
                    console.log('hello 哪吒编程')

                    setTimeout(() => 
                        console.log('hello 云韵')
                   
						 setTimeout(() => 
	                        console.log('hello 比比东')
	                    ,1000)
                    ,1000)
                ,1000)
            )
		</script>
	</head>
	<body>
	</body>
</html>

这种情况下便出现了回调地狱。当异步操作越多,这种嵌套的层级也就越复杂,不利于代码维护。

3、通过promise函数解决回调地狱的问题

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
            //使用promise进行异步操作
            new Promise((resolve, reject) => 
                resolve()
            ).then(() => 
                setTimeout(() => 
                    console.log('hello 哪吒编程')
                    console.log('hello 哪吒编程')
                    console.log('hello 哪吒编程')

                    return new Promise((resolve, reject) => 
                        resolve()
                    ).then(() => 
                        setTimeout(() => 
                            console.log('hello 云韵')

                            return new Promise((resolve, reject) => 
                                resolve()
                            ).then(() => 
                                setTimeout(() => 
                                    console.log('hello 比比东')
                                ,1000)
                            )
                        ,1000)
                    )
                ,1000)
            ).catch((err) => 
                console.log(err)
            )
		</script>
	</head>
	<body>
	</body>
</html>

代码虽然更加复杂了,但是代码的结果还是比较清晰的。

二、Promise的三种状态

1、pending

等待状态

2、fulfill

满足状态,当主动回调resolve时,就处于该状态,并且会回调.then()

3、reject

拒绝状态,当主动回调reject时,就处于该状态,并且会回调.catch()

三、Promise的另一种写法

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
            //使用promise进行异步操作
            new Promise((resolve, reject) => 
                //resolve('hello 哪吒编程')
                reject('我是一个大bug')
            ).then(data => 
                console.log(data)
            ,err => 
                console.log(err)
            )
		</script>
	</head>
	<body>
	</body>
</html>

四、Promise的链式调用

1、菜鸟写法

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
            //使用promise进行异步操作
            new Promise((resolve, reject) => 
                setTimeout(() => 
                    resolve('hello 哪吒编程')
                ,1000)
            ).then(data => 
                console.log(data, '测试第 1 次')

                return new Promise((resolve, reject) => 
                    resolve(data, '11111')
                )
            ).then(data => 
                console.log(data, '测试第 2 次')

                return new Promise((resolve, reject) => 
                    resolve(data, '22222')
                )
            ).then(data => 
                console.log(data, '测试第 3 次')
            )
		</script>
	</head>
	<body>
	</body>
</html>

2、中级写法

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
            //使用promise进行异步操作
            new Promise((resolve, reject) => 
                setTimeout(() => 
                    resolve('hello 哪吒编程')
                ,1000)
            ).then(data => 
                console.log(data, '测试第 1 次')

                return Promise.resolve(data, '11111')
            ).then(data => 
                console.log(data, '测试第 2 次')

                return Promise.resolve(data, '22222')
            ).then(data => 
                console.log(data, '测试第 3 次')
            )
		</script>
	</head>
	<body>
	</body>
</html>

3、大师写法

省略掉Promise.resolve

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
            //使用promise进行异步操作
            new Promise((resolve, reject) => 
                setTimeout(() => 
                    resolve('hello 哪吒编程')
                ,1000)
            ).then(data => 
                console.log(data, '测试第 1 次')

                return data + '11111'
            ).then(data => 
                console.log(data, '测试第 2 次')

                return data + '22222'
            ).then(data => 
                console.log(data, '测试第 3 次')
            )
		</script>
	</head>
	<body>
	</body>
</html>

五、Promise的all方法的使用

1、菜鸟写法

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
            
            let isResult1 = false
            let isResult2 = false
            //请求1
            $ajax(
                url: '',
                success: function () 
                    console.log('请求1')
                    isResult1 = true
                    handleResult()
                
            )

            //请求2
            $ajax(
                url: '',
                success: function () 
                    console.log('请求2')
                    isResult2 = true
                    handleResult()
                
            )

            function handleResult()
                if(isResult1 && isResult2)
                    console.log('两个请求都成功了,执行以下操作:')
                
            
		</script>
	</head>
	<body>
	</body>
</html>

2、Promise的all方法的使用

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
            Promise.all([
                new Promise(() => 
                    //请求1
                    $.ajax(
                        url: '',
                        success: function (data) 
                            resolve(data)
                        
                    )
                ),
                new Promise(() => 
                    //请求2
                    $.ajax(
                        url: '',
                        success: function (data) 
                            resolve(data)
                        
                    )
                ),
            ]).then(results => 
                results[0]
                results[1]
            )
		</script>
	</head>
	<body>
	</body>
</html>

以上是关于ES6 promise的用法总结的主要内容,如果未能解决你的问题,请参考以下文章

es6 promise 简单总结

ES6----Promise基本用法

ES6 promise的用法

ES6 Promise用法讲解

ES6之Promise用法详解

ES6 Promise 用法