promise
一、理解
- 抽象的表达: promise是js中进行异步编程的新的解决方案(旧的是谁)?旧的是纯回调函数
- 具体表达:
(1)从语法上来说:promise是一个构造函数
(2)从功能上来说:promise对象用来封装
二、概述
- promise是异步编程的一种解决方案。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。
- Promise 异步操作有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。除了异步操作的结果,任何其他操作都无法改变这个状态。
- Promise 对象只有:从 pending 变为 fulfilled 和从 pending 变为 rejected 的状态改变。只要处于 fulfilled 和 rejected ,状态就不会再变了即 resolved(已定型)。
- Promise是一个构造函数,其原型上有then、catch方法,对象上有reject、resolve方法。
三、Promise 异步操作三种状态过程图
四、Promise的语法
new Promise( function(resolve, reject) {...} /* executor */ );
下面我们来解释一下resolve和reject是什么
<script>
const flag = true //承诺true/false
const proObj = new Promise(function (resolve, reject) {
if (flag) {
resolve("成功")
} else {
reject("失败")
}
});
proObj.then(function (result) {
console.log(result); //成功
}).catch(function (err) {
console.log(err); //失败
})
</script>
这里的resolve,和reject参数是函数,当承诺实现了的时候,就会调用resolve函数,然后对应的promise的状态就变成fulfilled;当承诺没有实现的时候,就会调用reject函数,其状态变成了rejected。是否还记得创建promise的语法:
new Promise( function(resolve, reject) {...} /* executor */ );
这里的executor是一个函数。就是new Promise括号括着的函数叫做executor,resolve和reject函数是作为executor的参数被传进去的,当然这两个参数是可选填的。resolve或reject函数如果被调用了就会把函数里的结果作为参数传递出去; resolve是把函数里的结果传递出去,而reject就说明是承诺没实现,这相当于是出错误了,所以它会把报错的信息作为参数传递出去。
.then()有两个参数: onFulfilled和onRejected,这两个参数看英文也知道是什么意思,这两个参数也是函数,onFulfilled当然是Promise'实现的时候调用,onRejected就是Promise被拒绝的时候调用的。我们来看看MDN怎么说:
onFulfilled
当Promise变成接受状态(fulfillment)时,该参数作为回调函数被调用(参考: Function)。该函数有一个参数,即接受的最终结果(the fulfillment value)。如果传入的 onFulfilled 参数类型不是函数,则会在内部被替换为(x) => x ,即原样返回 promise 最终结果的函数
onRejected
当Promise变成拒绝状态(rejection )时,该参数作为回调函数被调用(参考: Function)。该函数有一个参数,,即拒绝的原因(the rejection reason)。
.then()有两种写法任君选择
p.then(onFulfilled, onRejected);
p.then(function(value) {
// fulfillment
}, function(reason) {
// rejection
});
而.catch()是当promise没有实现的时候,状态为rejected时被使用。