搞懂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);
        })

在这里插入图片描述

扫描二维码关注公众号,回复: 12830222 查看本文章

猜你喜欢

转载自blog.csdn.net/tscn1/article/details/114971962