Promise常用的方法及使用场景

367 阅读3分钟

「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战

Promise中常用的操作

  • .then()操作,这个应该是用的最多的了,当Promise对象执行resole()时就会走.then(),.then()中有两个回调,一个是成功的回调一个是失败的回调,一般失败的回调都不写,都用.catch()来处理失败的回调,.then()操作返回的是Promise实例,因此可以使用链式调用,也就是可以.then()后边跟.then()

  • .catch()操作,相当于.then()操作中的第二个回调函数,调用reject()就会走.catch(),还有一种情况是,如果在resolve的回调的时候出现了某种错误,也会走入.catch()中

  • .all()操作,它的参数是一个数组,并且数组的每项都必须是一个Promise对象,只有当所有项的状态都变成resolved时,all()才会走.then(),否则就会走.catch()(注意:如果走了catch(),那么结果就是第一个reject()抛出的值),当all()的状态是resolved的时候,它的回调的参数也是一个数组,数组中的项的内容就是all()参数中数组各项resolve的内容,顺序也和参数的顺序一样,如下:

    let a = new Promise((resolve,reject)=>{
	setTimeout(()=>{
       resolve(6);
	},5000)
    });
    let b = new Promise((resolve,reject)=>{
            setTimeout(()=>{
           resolve(5);
            },3000)
    });
    let c = new Promise((resolve,reject)=>{
            setTimeout(()=>{
           resolve(8);
            },2000)
    });
    Promise.all([a,b,c]).then(res=>{
        console.log(res);
    })
    

运行结果如下:

image.png 这里要注意

使用场景:当需要多个promise的resolve()结果按顺序执行后边的内容时,或者需要都执行成功的情况下再执行特定操作的时候(比如多个promise都成功了再加载页面,否则loading)。还需要特别注意的一点是all()参数中的项并不是按顺序执行的,如下截图可知

image.png

  • race()操作,race的参数和all一模一样,都是一个数组,并且数组的项要是Promise对象,race()的执行结果取决于参数中那个promise对象先执行完,那个先执行完race()就以谁来执行,不论它是resolve还是reject(),如下例子
    let a = new Promise((resolve,reject)=>{
	setTimeout(()=>{
       resolve(6);
	},5000)
    });
    let b = new Promise((resolve,reject)=>{
            setTimeout(()=>{
           resolve(5);
            },3000)
    });
    Promise.race([a,b]).then(res=>{
        console.log(res);
    })

运行结果如下:

image.png

    let e = new Promise((resolve,reject)=>{
	setTimeout(()=>{
       resolve(6);
	},5000)
    });
    let f = new Promise((resolve,reject)=>{
            setTimeout(()=>{
           reject(5);
            },3000)
    });
    Promise.race([e,f]).then(res=>{
        console.log(res);
    }).catch(err =>{
        console.log('reject',err)
    })

结果如下:

image.png

使用场景: 比如图片加载时,我们可以再写一个定时器来作为另一个promise,如果图片请求的时间比定时器的时间长,那么就输出图片超时等等(race()记住就是谁跑的快结果执行谁就行了,不区分resolve()和reject())

  • finally()操作,finally()的意思就是不论promise对象的执行结果是resolve()还是reject()都会执行finally()中的内容

使用场景: 当一个promise对象不管是resolve()还是reject()的时候都要进行某项操作时就可以使用finally(),这时就不用在.then()和.catch()重复写两边相同的内容了;也可以用于当执行完.then()或者.catch()后,还需要执行别的内容的时候使用。