面试题:Promise用法及理解

一. Promise由来

es6之前,我们处理异步函数非常麻烦,需要自己定义回调函数让使用者传入,才可以进行正常的回调;但是这样做没有一个固定的格式,那么不同开发者开发的方法,需要传入的回调函数顺序,格式也各不相同,对于需要使用其他框架的开发者来说非常痛苦,学习成本很高;而且ajax很容易出现回调地狱,es6推出了Promise类,就是为了解决这一现象的。

二. Promise解决异步

Promise是es6新推出的一个类,顾名思义就是许诺,承诺;意思是给开发者一个承诺,代码执行成功或者失败,都会执行规定好的回调函数。

写法:promise类中需要传入一个函数,函数内部也有两个参数,分别是resolve和reject
.resolve() 将Promise对象的状态从“未完成”变为“成功”
.rejected() 将Promise对象的状态从“未完成”变为“失败”
如果不调用这两个方法,那么promise会直接结束。

function fun(num) {
	const promise = new Promise((resolve, reject) => {
		setTimeout(() => {
			if (num > 0) {
				resolve(`${num},大于0`)
			} else {
				reject(`${num},小于0`)
			}
		})
	})
}

fun(10).then(res => console.log(res))
fun(-1).catch(err => console.log(err))

三. Promise状态区分

  1. pending:执行时状态
  2. fulfilled:已完成,执行resolve
  3. rejected:操作失败,执行reject

四. resolve传入不同值的区别

  1. 传入正常数值或者对象,会作为.then回调函数的参数
  2. 传入promise对象,那么会看这个对象执行的结果
  3. 传入对象带then方法,那么会执行该方法,根据结果决定状态

五. 多次调用then、catch

then、catch返回值是新的promise,所以可以多次调用。(then有第二个参数err,可以代替catch,区别就是如果then中出现异常只能catch处理)

const promise = new Promise((resolve, reject) => {
	resolve('aaa')
})

promise.then(res=>{
	console.log(res) // aaa
	return 'bbb'
}).then(res => {
	console.log(res) // bbb
})

promise.then(res => {
	console.log(res) // aaa
})

六. finally

不管Promise是什么状态,都会执行finally!

七. all、allSettled方法

Promise类提供了一个all方法,可以把多个promise实例放到一起,形成新的Promise,新Promise的状态由内部所有Promise决定,当内部都是fulfilled状态,它才是fulfilled,把所有Promise返回值放到一个数组里返回;有一个rejected,那就是rejected

const p1 = new Promise()
const p2 = new Promise()
const p3 = new Promise()

Promise.all([p1,p2,p3]).then(res=> {
	console.log("all promise res:", res)
})

allSettled方法就是返回每个promise的结果,无论状态如何

    Promise.allSettled([p1, p2, p3]).then(res => {
      console.log("all settled:", res)
    })
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值