Promise 状态
状态的特点
Promise 异步操作有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。除了异步操作的结果,任何其他操作都无法改变这个状态。
Promise 对象只有:从 pending 变为 fulfilled 和从 pending 变为 rejected 的状态改变。只要处于 fulfilled 和 rejected ,状态就不会再变了即 resolved(已定型)。
then 方法
then 方法接收两个函数作为参数,第一个参数是 Promise 执行成功时的回调,第二个参数是 Promise 执行失败时的回调,两个函数只会有一个被调用。
new Promise((resolve,reject) => {
resolve('success3');
}).then((result) => { //执行成功时的回调
console.log(result)
}, (err) => { //执行失败时的回调
console.log(err)
})
也可以用catch方法捕获异常
new Promise((resolve,reject) => {
resolve('success3');
}).then((res) => {
console.log(res);
}).catch((err) => {
console.log(err);
})
Promise的链式调用
主要的思想是在then方法里返回Promise对象,以下三种方式都是用于调用reslove
new Promise((resolve,reject) => {
resolve('success3');
}).then((res) => {
console.log(res);
// 第一种方式
return new Promise((reslove) => { //不使用reject方法的时候可以不用传reject
reslove(res + '123');
})
}).then((res) => {
console.log(res);
//第二种方式
return Promise.reslove(res + '222')
}).then((res) => {
console.log(res);
//第三种方式
return res + '333'
})
reject的使用和resolve大体相同,可通过new Promise和Promise.reject调用,除了这两种方式,还可以通过throw抛出异常
new Promise((resolve,reject) => {
resolve('success3');
}).then((res) => {
console.log(res);
// return Promise.reject('error message')
throw 'error message'
}).catch((err) => {
console.log(err);
})
Promise.all()
Promise.all() 方法接收一个promise的iterable类型(注:Array,Map,Set都属于ES6的iterable类型)的输入,并且只返回一个Promise实例, 那个输入的所有promise的resolve回调的结果是一个数组。这个Promise的resolve回调执行是在所有输入的promise的resolve回调都结束,或者输入的iterable里没有promise了的时候。它的reject回调执行是,只要任何一个输入的promise的reject回调执行或者输入不合法的promise就会立即抛出错误,并且reject的是第一个抛出的错误信息。
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then((values) => {
console.log(values);
});
// expected output: Array [3, 42, "foo"]
Promise.allSettled()
该Promise.allSettled()方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的promise结果。
当您有多个彼此不依赖的异步任务成功完成时,或者您总是想知道每个promise的结果时,通常使用它。
相比之下,Promise.all() 更适合彼此相互依赖或者在其中任何一个reject时立即结束。
const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, 'foo'));
const promises = [promise1, promise2];
Promise.allSettled(promises).
then((results) => results.forEach((result) => console.log(result.status)));
// expected output:
// "fulfilled"
// "rejected"