上一篇介绍了Promise的一些基本用法和串联,这一篇具体讲一下它的API,包括上篇使用的then和catch,以及扩充的静态成员finally和几个静态成员。
目录
1.实例成员
1)then
注册一个后续处理函数,当Promise为resolved状态时运行该函数
2)catch
注册一个后续处理函数,当Promise为rejected状态时运行该函数
3)finally
注册一个后续处理函数(无参),当Promise为已解决阶段时运行该函数
即,resolved状态执行then和finally注册的函数,rejected状态执行catch和finally注册的函数,切记,finally注册的函数是不能传递参数的,例子如下:
【例1】
const pro = new Promise((resolve, reject) => {
if (Math.random() > 0.5) {
resolve(1)
} else {
reject(2)
}
})
pro.then(resp => console.log('then:',resp));
pro.catch(err => console.log('catch:',err));
pro.finally(() => console.log('finally'));
【结果】当事件推向resolve状态时,打印结果如图1-1
当事件推向rejected状态时,打印结果如图1-2
2.静态成员
1)resolve(数据)
该方法返回一个resolved状态的Promise,传递的数据作为状态数据【例2-1】
【注】如果传递的数据是Promise,则直接返回传递的Promise对象【例2-2】
【例2-1】
const pro = Promise.resolve(1);
pro.then(resp => {
console.log('resp:',resp);
})
以上代码等价于下列代码
const pro = new Promise((resolve, reject) => {
resolve(1);
})
pro.then(resp => {
console.log('resp:',resp);
})
【结果】上述两段代码的打印结果均如图1-2-1
2)reject(数据)
该方法返回一个rejected状态的Promise,传递的数据作为状态数据,与resolve()相似,这里就不再举例子了
3)all(iterable):
- 该方法返回一个新的Promise对象,该Promise对象在iterable参数对象里所有的Promise对象都成功的时候触发【例3-1】,一旦有任何一个iterable里面的Promise对象失败则立即触发该Promise对象的失败【例3-2】;
- 这个新的Promise对象在触发成功状态以后,会把一个包含iterable里所有Promise返回值的数组作为成功回调的返回值,顺序跟iterable的顺序保持一致,这里参考【例3-1】;
- 如果这个新的Promise对象触发了失败状态,它会把iterable里第一个触发失败的Promise对象的错误信息作为它的失败错误信息,这里参考【例3-2】
【注】Promise.all方法常被用于处理多个Promise对象的状态集合。
这里举一个查看班级内所有同学都通过考试的例子,来说明以上三点
【例3】
//在最大值和最小值之间随机产生一个数字
function getRandom(min, max) {
return Math.floor(Math.random() * (max - min) + min);
}
//查看该学生的成绩是否合格
function passExam(studentId, grade) {
return new Promise((resolve, reject) => {
console.log(`学生${studentId}开始查成绩`);
setTimeout(() => {
if (grade <= 100 && grade >= 60) {
console.log(`学生${studentId}通过了考试`);
resolve(true);
} else if (grade < 60 && grade >= 0) {
console.log(`学生${studentId}没有通过考试`);
resolve(false);
} else {
reject(`学生${studentId}成绩有误`)
}
}, getRandom(1000, 3000));
})
}
//查看该班级所有学生的成绩是否均合格
function ifAllStudentsPassExam(gradeList) {
const proms = []; //记录所有学生的查成绩结果
let passNum = 0; //通过考试的人数
let unPass = 0; //没有通过考试的人数
for (let i = 0; i < gradeList.length; i++) {
const pro = passExam(i + 1, gradeList[i]).then(resp => {
if (resp) {
passNum++;
console.log(`${passNum}名学生通过`);
} else {
unPass++;
console.log(`${unPass}名学生没有通过`)
}
return resp;
}, err => {
throw err;
})
proms.push(pro);
}
Promise.all(proms).then(results => {
console.log(`日志记录:${results}`)
})
}
【例3-1】当该班级中所有同学的成绩都是有效成绩,即成绩值处在[0,100]内时,proms中所有对象都成功触发,代码如下
const gradeArr = [100, 99, 45]; //学生的成绩
ifAllStudentsPassExam(gradeArr);
【结果】当proms中所有对象都成功触发时,Promise.al(proms)到resolved状态,执行thenable函数
【例3-2】当班级中学生的成绩有无效成绩时,代码如下
const gradeArr = [100, 99, 101]; //学生的成绩
ifAllStudentsPassExam(gradeArr);
【结果】
4)race(iterable)
当iterable参数里的任意一个子Promise被成功或失败后,父Promise马上也会用子Promise的成功返回值或失败详情作为参数调用父Promise绑定的相应句柄,并返回该Promise对象【例4】
【例4】
function getRandom(min, max) {
return Math.floor(Math.random() * (max - min)) + min;
}
const proms = [];
for (let i = 0; i < 10; i++) {
proms.push(new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() > 0.5) {
console.log(i, '完成');
resolve(i);
} else {
console.log(i, '失败');
reject(i);
}
}, getRandom(1000, 3000));
}))
}
const pro = Promise.race(proms);
pro.then(datas=> {
console.log('有人完成了',datas);
})
pro.catch(err=>{
console.log('有人失败了',err)
})
console.log(proms);
console.log(pro);
【结果】当有人先完成了,打印结果如下
当有人先失败了,打印结果如下