Promise的使用
Promise概念
Promise 是异步编程的一种解决方案:从语法上讲,promise是一个对象,从它可以获取异步操作的消息;通过then方法将嵌套做法转换成连续then,上一个then中返回一个promise实例,这个实例将返回resolve或者reject,以此来确定下一个then中执行的方法。
Promise存在三种状态:
一、Promise存在三种状态
pending(等待态),
fulfiled(成功态),
rejected(失败态);
三种状态存在标准的顺序:
pending --> fulfilled
pending -->rejected
状态一旦改变,就不会再变。创造promise实例后,它会立即执行
//此处代表执行时,promise处于初始化状态
let promise = promise.then(() =>{},()=>{})
then方法返回一个新的Promise,而它的行为与then中的回调函数的返回值有关:
如果then中的回调函数返回一个值,那么then返回的Promise将会成为成功状态,promise持有的值就是该返回值。
如果then中的回调函数返回一个Promise,那么then返回的Promise会继承他的状态和值
如果then中的回调函数抛出一个错误,那么then返回的Promise将会成为失败状态,promise持有的值就是错误原因
//此处代表执行时,promise处于初始化状态
promise.then(()=>{},()=>{})
————————————————
二、使用步骤
1.Promise实践
① promise的实例对象三种状态是如何切换的 (成功 失败 初始化)
② promise的实例持有值为多少
当通过new Promise创造出来的promise实例; 他状态的改变以及持有的值 都跟执行器有关,new Promise时 执行器先执行 再返回promise实例。
执行器的返回值会被忽略
如果执行器中什么都没有发生,创建出来的promise实例则是初始化状态,持有值是undefined
如果执行器中resolve被调用,创建出来的实例是成功状态,持有的值是resolve函数第一个参数
如果执行器中reject被调用,创建出来的实例是失败状态,持有的值是reject函数第一个参数
如果执行器中发生异常,创建出来的promise实例是失败状态,持有的值是失败原因
let promsie = new Promise((resolve, reject)=>{
// 执行器内部的resolve, reject一定要放在一个异步环境下调用!!!
setTimeout(()=>{
resolve()
},2000)
})
promise是一个状态机,在promise状态改变时, 可以决定其then方法中的两个参数什么时候进队列,谁进队列。
then方法有两个参数是两个回调,这两个回调中的一个回调最终是要进队列的,至于是哪一个回调什么时候进队列取决用这个then方法的promise对象的状态什么时候发生改变,改变成什么状态
代码如下(示例):
const p new Promise((resolve, reject) => {
$.ajax({
type: 'GET',
url: 'www.baidu.com/getxxxx',
success: res => {
resolve(res);//成功
}
})
})
.then(value=>{
console.log(value); //成功了
/* return的东西可被下一个then接受到 */
return new Promise((resolve, reject) => {
$.ajax({
type: 'GET',
url: 'www.baidu.com/getxxxx',
success: res => {
resolve(res);//成功
}
})
})
})
.then().then()
/* 相同的代码可封装成函数 */
.catch
错误处理
const p new Promise((resolve, reject) => {
reject();
})
p.then().then().catch()
.all()
Promise.all([p1, p2, p3])用于将多个promise实例,包装成一个新的Promise实例,返回的实例就是普通的promise。
它接收一个数组作为参数,数组里可以是Promise对象,也可以是别的值,只有Promise会等待状态改变,当所有的子Promise都完成,该Promise完成,返回值是全部值得数组,有任何一个失败,该Promise失败,返回值是第一个失败的子Promise结果
.race()
类似于.all() ,区别在于它有任意一个完成就算完成
总结
主要功能是链式调用。