Promise第二篇:你需要记着的API

上一篇介绍了Promise的一些基本用法和串联,这一篇具体讲一下它的API,包括上篇使用的then和catch,以及扩充的静态成员finally和几个静态成员。


目录

1.实例成员

1)then

2)catch

3)finally

2.静态成员

1)resolve(数据)

2)reject(数据)

3)all(iterable):

4)race(iterable)


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

图1-1

 当事件推向rejected状态时,打印结果如图1-2

图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-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-1

【例3-2】当班级中学生的成绩有无效成绩时,代码如下

const gradeArr = [100, 99, 101]; //学生的成绩
ifAllStudentsPassExam(gradeArr);

【结果】

图3-2

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);

【结果】当有人先完成了,打印结果如下

图4-1

当有人先失败了,打印结果如下

图4-2

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值