promise关键问题

如何修改promise的状态?

promise原状态是pending(未决定的),在执行器中调用resolve(),状态会变为成功,调用reject(),会变为失败。除此之外,我们还可以通过throw语句,将状态改为失败。

let p1=new Promise((resolve,reject)=>{
				throw '出错啦'
			})

在这里插入图片描述
promise能否执行多个回调?

也就是,then方法如果指定多个回调,这些回调是不是都会执行?答案是肯定的。

let pp=new Promise((resolve,reject)=>{
	resolve('ok');
})
// 回调1
pp.then(value=>{
	console.log(value)
})
// 回调2
pp.then(value=>{
	alert(value)
})
console.log(pp)

只要promise的状态发生改变,回调函数就会执行。

改变状态与指定回调的顺序

因为promise是用来处理异步任务的,所以正常情况下是先指定回调再改变状态,但也可以先改变状态再指定回调。如果执行器中的任务是同步执行的,就会先改变状态,再指定回调。

如何先改变状态再指定回调?
(1)在执行器中直接调用resolve()或者reject()。
(2)延迟更长时间才调用then。

什么时候执行的回调?
指定回调与执行回调不是一个概念,指定回调相当于声明了then方法,执行回调才是执行then里边的函数。
执行回调的时机与改变状态、指定回调二者的顺序有关。只有两种可能:
改变状态->指定回调->执行回调;
指定回调->改变状态->执行回调。

then方法返回结果由什么决定?

由指定函数的执行结果决定。

如何串联多个任务?

let p=new Promise((resolve,reject)=>{
	setTimeout(()=>{
		resolve('ok');
	},1000)
});
p.then(value=>{
	return new Promise((resolve,reject)=>{
		resolve('success');
	})
}).then(value=>{
	console.log(value)//success
})

第一个then的返回结果是一个成功的promise,接着.then,那么执行结果由该promise的执行结果决定,也就是success。

p.then(value=>{
	return new Promise((resolve,reject)=>{
		resolve('success');
	})
}).then(value=>{
	console.log(value)
}).then(value=>{
	console.log(value)
})

上述代码的执行结果是undefined,因为第三次.then,它的执行结果应该是上一个then返回的promise的执行结果的返回值,但是我们没有给返回值,所以value是undefined。第二个then的返回结果是一个成功的promise,且成功的结果是undefined,所以第三个会打印出undefined。

promise的异常穿透

let p=new Promise((resolve,reject)=>{
	setTimeout(()=>{
		// resolve('ok');
		reject('失败了')
	},1000)
});
p.then(value=>{
	return new Promise((resolve,reject)=>{
		resolve('success');
	})
}).then(value=>{
	console.log(value)
}).then(value=>{
	console.log(value)
}).catch(reason=>{
	console.log(reason)//失败了
})

处理异常只需要在最后写一次catch即可,前边的then都不会执行。

如何中断promise链

前边说,因为then的返回结果是一个promise,所以可以一直调用.then,这就是promise链。
中断promise链的方法只有一个,就是让then返回一个pending状态的promise,因为promise的状态没有改变,then方法就没办法执行。

p.then(value=>{
	return new Promise((resolve,reject)=>{})
}).then(value=>{
	console.log(value)
}).then(value=>{
	console.log(value)
})

第一个then返回的是pending状态的promise(因为没有调用resolve或reject),后边的.then不会被执行,也不会输出任何结果。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值