- 定义: 包含异步操作结果的对象
- 状态
- 进行中: pending
- 已成功:resolved
- 已失败:rejected
- 特点
- 对象的状态不受外界影响
- 一旦状态改变就不会再变,任何时候都可以得到这个结果
- 声明:
new Promise((resolve,reject) =>{})
- 参数
-
resolve: 将状态从未完成变为成功,在异步操作成功时调用,并将异步操作的结果作为参数传递出去
-
reject: 将状态从未完成变为失败,在异步操作失败是调用,并将异步操作的错误作为参数传递出去
- 方法
- then():分别指定resolved状态和rejected状态的回调函数
- 第一参数:状态变为resolved时调用
- 第二参数:状态变为rejected时调用(可选)
- catch():指定发生错误时的回调函数
//catch方法
catch(onRejected){
return this.then(null,onRejected)
}
- Promise.all():将多个实例包装成一个新实例,返回全部实例状态变更后的结果数组(齐变更再返回)
- 入参:具有Iterator接口的数据结构
- 成功:只有全部实例状态变成fulfilled,最终状态才会变成fulfilled
- 失败:其中一个实例状态变成rejected,最终状态就会变成rejected
//all方法
let arr = ['老子想月薪过万', '月薪过万想老子', '想老子月薪过万'].map(
(value) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(value);
}, value * 1000);
});
}
);
console.log(arr);
let promises = Promise.all(arr)
.then((result) => {
console.log(result);
}).catch((err) => {
console.log(err);
});
[ Promise { <pending> },
Promise { <pending> },
Promise { <pending> } ]
['老子想月薪过万', '月薪过万想老子', '想老子月薪过万'] // 3s后输出的结果
- Promise.race():将多个实例包装成一个新实例,返回全部实例状态优先变更后的结果(先变更先返回)
- 入参:具有Iterator接口的数据结构
- 成功失败:哪个实例率先改变状态就返回哪个实例的状态
//race方法
let arr = ['老子想月薪过万', '月薪过万想老子', '想老子月薪过万'].map(
(value) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(value);
}, value * 1000);
});
}
);
console.log(arr);
let promises = Promise.race(arr)
.then((result) => {
console.log(result);
}).catch((err) => {
console.log(err);
});
[ Promise { <pending> },
Promise { <pending> },
Promise { <pending> } ]
老子想月薪过万 // 是最先改变状态的那个Promise实例resolve的值
- Promise.resolve():将对象转为Promise对象(等价于
new Promise(resolve => resolve()))
- Promise实例:原封不动地返回入参
- Thenable对象:将此对象转为Promise对象并返回(Thenable为包含then()的对象,执行then()相当于执行此对象的then())
- 不具有then()的对象:将此对象转为Promise对象并返回,状态为resolved
- 不带参数:返回Promise对象,状态为resolved
- Promise.reject():将对象转为状态为rejected的Promise对象(等价于
new Promise((resolve, reject) => reject()))
//resolve方法
Promise.resolve = function(val){
return new Promise((resolve,reject)=>{
resolve(val)
})
}
//reject方法
Promise.reject = function(val){
return new Promise((resolve,reject)=>{
reject(val)
})
}
// reject的用法
let p = new Promise((resolve, reject) => {
//做一些异步操作
setTimeout(function(){
var num = Math.ceil(Math.random()*10); //生成1-10的随机数
if(num<=5){
resolve(num);
}
else{
reject('数字太大了');
}
}, 2000);
});
p.then((data) => {
console.log('resolved',data);
},(err) => {
console.log('rejected',err);
}
);