文章目录
一、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>