搞懂promise【3】

promise其它api

  • finally:[ES2018]注册一个后续处理函数(无参),当Promise为已决时运行该函数。为什么无参数,因为已决时,可能是resolve,也可能是rejected。传了参数不能确定是哪一个。
  • finally的运行和注册顺序有关。
const pro = new Promise((resolve, reject) => {
            resolve(1);
        })
        pro.finally(() => console.log("finally1"))
        pro.finally(() => console.log("finally2"))
        pro.then(resp => console.log("then1", resp * 1));
        pro.then(resp => console.log("then2", resp * 2));
        pro.catch(resp => console.log("catch1", resp * 1));
        pro.catch(resp => console.log("catch2", resp * 2));
       

在这里插入图片描述

const pro = new Promise((resolve, reject) => {
            resolve(1);
        })
       
        pro.then(resp => console.log("then1", resp * 1));
        pro.then(resp => console.log("then2", resp * 2));
        pro.catch(resp => console.log("catch1", resp * 1));
        pro.catch(resp => console.log("catch2", resp * 2));
        pro.finally(() => console.log("finally1"))
        pro.finally(() => console.log("finally2"))

在这里插入图片描述

静态方法 resolve

const pro = new Promise((resolve,reject)=>{
		resolve(1;)
})

上面这段代码相当于:

const pro = Promise.resolve(1);
  • 如果传递数据是promise,那么直接将promise返回
  • Google是这样的,其它不一定。
const p = new Promise((resolve,reject)=>{
	resolve(1;)
})
const pro = Promise.resolve(p);

//那么pro和p相等
console.log(p === pro); //true;

静态方法reject

const pro = new Promise((resolve,reject)=>{
		reject(1;)
})

上面这段代码相当于:

const pro = Promise.reject(1);

all

Promise.all([pro1,pro2,pro3......])

  • 返回一个新的promise,这个新的promise要等到,pro1,pro2…所以传递进来的promise变成resolved状态,才会触发新的promise的resolved。
    比如:
	const newPro = Promise.all([Promise,Promise,Promise,.....]);
	newPro.then(data=>{
			console.log(data);//这里输出要等到所有的Promise变成resolved状态。
	})
  • 例子
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(()=>{
                    console.log('resolve',i);
                    resolve(i);
                },getRandom(2000,3000));
            }))
        }

        const pro = Promise.all(proms);

        pro.then(data=>{
            console.log(data);
        })

在这里插入图片描述

 pro.then(data=>{
            console.log(data);
        })

输出data,必须要等到所以的promise变成resoled状态,一旦有reject那么就不会输出结果。

  • 例如将上面的代码改写一下
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('resolve',i);
                    	resolve(i);
                	} else {
                		console.log('reject',i);
                   		reject(i)
					}
                },getRandom(2000,3000));
            }))
        }

        const pro = Promise.all(proms);

        pro.then(data=>{
            console.log(data);
        },err=>{
            console.log('err',err);
        })

在这里插入图片描述

Promise.all()应用场景

基于等全部promise都变成resolved才会将结果输出,可以应用到页面中多个请求的合并,等到页面的所有请求完成后,处理什么事情。一旦有一个失败了就失败了。

Promise.race()

第一个完成,就是完成,第一个失败,就失败。只要有一个怎么样,整体就怎么样。看谁先完成,看谁先失败。

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(2000, 3000));
            }))
        }

        const pro = Promise.race(proms);

        pro.then(data => {
           //有完成的立马运行到这里
            console.log('有人完成了',data);
        },err=>{
        	//有失败的立马运行到这里
            console.log('有人失败了',err);
        })

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值