JavaScript Promise 对象

  • Post author:
  • Post category:java





一、Promise是什么?

ECMAscript 6 原生提供了 Promise 对象。

Promise 对象代表了未来将要发生的事件,用来传递异步操作的消息



二、Promise的三种状态


1.Pending(进行中)

2.Fulfilled(已成功)

3.rejected(已失败)


Promise对象的三种状态不受外界的影响,只有Promise中存放的将来会结束的时间才会影响。


Promise状态一旦改变,不可逆

Pending ==> Fulfilled

Pending ==> rejected



三、Promise对象创建


Promise是一个构造函数,在创建对象的时候需要传入一个回调函数


回调函数有2个参数,分别代表resolve(解决),reject(拒绝),并且都是函数

调用resolve函数,代表Promise的状态会从Pending –> fulfilled

调用reject函数,代表Promise的状态会从Pending –> rejected


代码如下(示例):

let promise = new Promise(function(resolve,reject){
	// 主要编写的是将来会结束的事件代码(异步请求)
	// 调用resolve函数
	reject("error");
	// resolve("ok");
})
	console.log(promise)



四、Promise中then和catch方法



1.then

如果promise状态为fulfilled,则调用then方法来处理对应的成功的逻辑



2.catch

如果promise状态为reject,则调用catch方法来处理对应的失败的逻辑


1)then和catch方法的参数也是一个函数,而且这个函数返回的都是一个新的Promise对象

2)then和catch在函数中可以return一个值,如果没有return 默认代表return undefined

3)如果return的是一个非Promise对象,那么会通过Promise.resolve()将返回的值转成一个状态为fulfilled的Promise对象

4)如果return的是一个Promise对象,则返回一个新的Promise对象,Promise对象的状态由返回的Promise对象状态来确定


代码如下(示例):

<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
    	let promise = new Promise(function(resolve, reject) {
			// 主要编写的 是 将来会结束的事件代码 (异步请求)
			// 调用 resolve 函数
			resolve("ok") ;
		});
		promise.then(function(s) {
			console.log("事情已被解决~~~", s)
		})
		promise.catch(function(s) {
			console.log("事情败露了~~~", s)
		})
	</script>
</head>
<body>
</body>
</html>



五、Promise中resolve和reject方法



1.Promise如何创建对象


方法一:


创建Promise一种方式(最常用的方式)

new Promise ((resolve,reject) => {


})


方法二:


创建一个状态为fulfilled的Promise对象

Promise.resolve();


方法三:


创建一个状态为rejected的Promise对象

Promise.reject();


代码如下(示例):

let p = Promise.resolve("ok")
		p.then((res) => {
		console.log(res)
})
let p2 = Promise.reject("error");
		p2.catch(error => {
		console.log(error)
})



2.thenable对象

thenable对象指的是对象中有一个then对象

如果Promise状态为fulfilled,则会立即执行then方法


代码如下(示例):

let obj = {
			name:'zhangsan',
			then(s){
				console.log(this.name,s)
	}
}
let p3 = Promise.resolve(obj);



六、Promise使用场景


代码如下(示例):

<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
    	// 预测3秒后,天空会下起小雨
			function timeout(minseconds){
				return new Promise((resolve,reject) =>{
					// 延迟用来模拟异步
					setTimeout(function(){
						// 生成一个0-1的随机数
						let num = Math.random();
						if(num>=0.3){
							// 设置Promise状态为fulfilled
							resolve()
						}else{
							reject()
						}
					},minseconds)
				})
			}
			// 预测3秒后下雨,5秒后下雪,如果都发生了,打印天气真糟糕,否则打印天气还行
			timeout(3000).then(()=>{
				console.log("下雨了")
				return timeout(2000);
			}).then(()=>{
				console.log("下雪了")
				console.log("天气真糟糕")
			}).catch(()=>{
				console.log("天气还行")
			})
	</script>
</head>
<body>
</body>
</html>



版权声明:本文为weixin_54597629原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。