1. Promise 的基本用法
- Promise 一般用于处理异步的回调函数 或 处理回调地狱(函数嵌套函数)
- 使用 Promise 需要传递 一个函数 且该函数需要接收两个参数 一个参数代表成功 一个参数代表失败
/* Promise 默认写法 */
let p = new Promise((resolve, reject) => { // resolve, reject 可以用别的命名
setTimeout(() => {
console.log('Promise默认写法:' + 1);
/*
resolve(); 成功状态
reject(); 失败状态
如果不给成功或者失败 那么 p.then() 不会被执行 永远处于等待状态
*/
// 当成功或者失败的时候p.then才会被执行
resolve('成功'); // 成功状态 resolve()可以传参数
reject('失败状态'); // 失败状态 reject()可以传参数
}, 1000);
});
p.then(data => { // 成功的时候执行
// data 成功状态的返回值
console.log('Promise默认写法:' + data);
}, data => { // 失败的时候执行
// data 失败状态的返回值
console.log('Promise默认写法:' + data);
});
2. .then()
- 如果Promise没有执行成功或者失败的函数,那么 .then() 不会被执行 永远处于等待状态
- .then() 可以接受一个或者两个函数
- 第一个函数接受Promise成功状态的返回值并且对它进行处理
- 第二个函数接受Promise失败状态的返回值并且对它进行处理
let p = new Promise((resolve, reject) => {
resolve('成功');
});
p.then(data => { // 成功的时候执行
// data 成功状态的返回值
console.log(data)
})
let p = new Promise((resolve, reject) => {
resolve('成功');
reject('失败');
});
p.then(data => { // 成功的时候执行
// data 成功状态的返回值
console.log(data)
}, data => { // 失败的时候执行
// data 失败状态的返回值
console.log(data)
})
- .then() 支持链式操作
- 使用情况一:第一个 .then() 返回的是 Promise对象,那么 第二 .then() 接收的值就是该 Promise对象 成功状态或者失败状态返回的值
let p1 = new Promise((resolve, reject) => {
resolve('p1的成功');
});
let p2 = new Promise((resolve, reject) => {
resolve('p2的成功');
reject('p2的失败')
});
p1.then(data => { // data 等待 p1 Promise 成功状态返回的值
console.log(data);
return p2
}).then(data => { // data 等待第一个 then 返回的 p2 Promise 成功状态返回的值
console.log(data)
}, data => { // data 等待第一个 then 返回的 p2 Promise 失败状态返回的值
console.log(data)
})
- 使用情况二:第一个 .then() 返回的不是 Promise对象,而是普通类型的值,那么 第二 .then() 接收得值就是该普通类型的值
let p = new Promise((resolve, reject) => {
resolve('成功');
});
p.then(data => { // data 等待 p1 Promise 成功状态返回的值
console.log(data); // 成功
return '普通状态的值'
}).then(data => { // data 直接接收第一个 then 返回的普通状态的值
console.log(data); // '普通状态的值'
})
3. .catch()
- 捕获失败状态的返回值
- 可以通过 .catch() 代替在 .then() 中传递第二个函数来捕获失败状态的返回值
let p = new Promise((resolve, reject) => {
// resolve('成功');
reject('失败')
});
p.then(data => {
console.log(data)
}).catch(msg => {
console.log(msg)
})
4. .finally()
- 无论Promise的状态是成功还是失败都会执行 .finally()
let p = new Promise((resolve, reject) => {
resolve('成功');
reject('失败')
});
p.then(data => {
console.log(data)
}).catch(msg => {
console.log(msg)
}).finally(() => {
console.log('无论Promise的状态是成功还是失败都会执行该方法')
})
5. 当有多个函数要等待执行的写法(异步操作函数嵌套函数)
- 不使用 Promise
timer(1);
function timer(data) {
setTimeout(() => {
console.log('不使用Promise:' + data);
timer2(data + 1); // 回调函数
}, 1000)
}
function timer2(data) {
setTimeout(() => {
console.log('不使用Promise:' + data);
}, 1000)
}
- 使用 Promise
let p2 = function (data) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(data);
}, 1000)
})
};
/*
.then 是 Promise的一个方法;
如果有两个以上的then的时候:
情况一:第一个 then 返回的是 Promise对象 那么 第二 then 接收得值是 Promise对象 成功状态返回的值
情况二:第一个 then 返回的不是 Promise对象 而是普通类型的值 那么 第二 then 接收得值就是该普通类型的值
*/
p2(1).then(data => { // data参数是接受成功或者失败状态传过来的值;
console.log('使用Promise处理异步回调:' + data);
return p2(data + 1);
}).then(data => { // data 等待第一个 then 返回的 p2 Promise 成功状态返回的值
console.log('使用Promise处理异步回调:' + data);
return data + 1;
}).then(data => { // data 直接接收第二个 then 返回的普通状态的值
console.log(data);
})
6. Promise.all
- 语法:Promise.all([Promise对象1, Promise对象2]).then();
- 说明:
- 只有当所有Promise对象执行完, Promise对象都为成功或者失败状态的时候then才会执行,如果有一个没有状态then都不会执行
- 所有Promise会同时执行
- 如果其中有一个Promise对象是失败状态那么.then()会执行失败状态的代码
- 如果Promise对象的成功状态都有值返回出去的话,就会以数组的形式返回出去给.then()接收
let p1 = new Promise((resolve, reject) => {
setTimeout(() => {
console.log(1);
resolve('成功1');
}, 1000)
});
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {
console.log(2);
resolve('成功2');
}, 2000)
});
Promise.all([p1, p2]).then(data => { // 成功状态
// data 存储着所有成功状态返回的值
console.log(data); // ["成功1", "成功2"]
}, data => { // 失败状态
console.log('失败');
});