Promise就是一个用来存储数据对象
但是由于Promise存取的方式的特殊,所以可以直接将异步调用的结果存储到Promise中
对Promise进行链式调用时
后边的方法(then和catch)读取的上一步的执行结果
如果上一步的执行结果不是当前想要的结果,会直接跳过当前方法
当Promise出现异常时,而整个调用链中没有出现catch,则异常会被抛出
后边的代码处理前边的错误,catch出错如果后面没有catch代码时错误会直接抛出,一般把catch写到最后
promise中的
then
catch
finally
- 这三个方法都会返回一个新的Promise 相当于后面加了 return new Promise()
Promise中会存储回调函数的返回值
finally
- finally的返回值,不会存储到新的Promise中
function sum(a, b) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(a + b);
}, 1000);
});
}
sum(123, 456)
.then(result => result + 7)
.catch(result => console.log('异常处理' + result))
.then(result => result + 8)
.then(result => console.log(result));
静态方法
- Promise.resolve() 创建一个立即完成的Promise
- Promise.reject() 创建一个立即拒绝的Promise
- Promise.all([...]) 同时返回多个Promise执行结果
其中有一个报错,就会返回错误
- Promise.allSettled([...]) 同时返回多个Promise执行结果无论是否成功
{status: 'fulfilled', value: 579}
{status: 'rejected', reason: '出错了'}
- Promise.race([...]) 返回一个执行最快的Promise结果,无论对错
- Promise.any([...]) 返回一个执行最快的完成的Promise结果,只有都报错才报错
// Promise.resolve(10);
// Promise.reject('出错了');
// Promise.all([sum(123, 456), sum(5, 6), sum(33, 44)]).then(r => {
// console.log(r);
// });
// Promise.allSettled([sum(123, 456), sum(5, 6), Promise.reject('出错了'),sum(33, 44)]).then(r => {
// console.log(r);
// });
// Promise.race([sum(123, 456), sum(5, 6), Promise.reject('出错了'), sum(33, 44)]).then(r => {
// console.log(r);
// }).catch(r => console.log('出错了'))
Promise.any([sum(123, 456), sum(5, 6), Promise.reject('出错了'), sum(33, 44)])
.then(r => {
console.log(r);
})
.catch(r => console.log('出错了'));