Promise是ES6新增内置类
Promise是一个“承诺”设计模式,用来解决JS异步编程中“回调地狱”
Promise是管控异步编程的,执行他的时候会立即把executor函数执行
new Promise的时候首先把([exectutor])函数执行,会给([exectutor])函数传递两个实参 ,resolve函数和reject函数
- [实例]:
- [PromiseStatus]
- [PromiseValue]
说明 | PromiseStatus状态 | PromiseValue值 |
---|---|---|
new promise的时候 | pedding | undefined |
RESOLVE函数执行的时候 | fulfilled / resolve | undefined |
REJECT函数执行的时候 | reject | 传递的第一个实参 |
- [Promise.prototype]
- then : 如果状态一旦确定,想去执行.then注入的方法,但是此方法没有被注册,则找下一个.then方法
- .then注入回调方法时,可写可不写
- .then([fnOK],[FnNO])
- .then([fnOK])
- .then(null,[fnNO])
- .then()
- then : 如果状态一旦确定,想去执行.then注入的方法,但是此方法没有被注册,则找下一个.then方法
Promise.reject(100).then(value => {
} /*value2 => { =====>此处reject函数没注入会找下一个.then方法
console.log(value2);
return Promise.resolve(200)
} */)
.then(null,/* value => { =====>此处resolve函数没注入会找下一个.then方法
console.log(value);
} */value2 => {
console.log(value2); =====>所以返回100
})
- catch
有了上面then的铺垫可得以下结论(catch原理说白了就是.then的第一个函数不写)p1.catch(reason=>{}) <===> p1.then(null,reason=>{})
所以项目中常用.then表示成功,.catch表失败
Promise.reject(100).then(value => {
console.log('OK',value);
}).catch(reason => {
console.log('NO',reason);
}) =====>NO 100
- finally : 同“异常捕获”,不管成功或者失败都会走
- [普通对象]
- reject() 成功实例
- resolve() 失败实例
- all 数组中存放着多个PROMISE实例,所有实例都是成功的,整体实例返回才成功,只要有一个失败的,就都是失败(整体都对才是对,只要有一个错就都错)
function fn1() {
return Promise.resolve(1);
}
function fn2() {
return new Promise((resolve,reject) => {
setTimeout(()=>{
resolve(2)
})
});
}
function fn3() {
return new Promise((resolve,reject) => {
setTimeout(()=>{
resolve(3)
})
});
}
Promise.all([fn1(),fn2(),fn3()]).then(values => {
// values[Array]:按照数组顺序存储每一个实例返回的结果
console.log(values); // =====> [1, 2, 3]
}).catch(reason => {
// 一旦失败,整体都是失败,存储的是每一个实例返回的结果
console.log(reason);
})
- race 看哪个PROMISE实例谁先处理完,就以谁的结果作为p3的结果(不论成功或失败,谁快听谁的)
Promise.race([fn1(),fn2(),fn3()]).then(value => {
console.log(value); // =====>1 谁先到就以谁为主
}).catch(reason => {
console.log(reason);
})
async / await 是ES7提出来的,是对Promise的一个补充
- 用async修饰的函数,都会返回一个promise实例
- 状态:大都是成功的,如果代码执行报错,返回失败 ,如果手动返回一个新的Promise实例,则按照新的实例状态处理
- 用await可以把一个异步任务变为类似同步的效果(本质不是同步,还是异步,而且是异步中的微任务)