JS中的promise

4 篇文章 0 订阅
1 篇文章 0 订阅

深入了解请看我更的上一篇文章 js的同步和异步

什么是promise?

promise是一种异步编程的解决方案:可以异步获取操作的信息,从而解决JS单线程的一些弊端。
promise有三种状态: pending(准备态), resolved(成功态),rejected(失败态)。状态一旦改变是不可逆的。

为什么要有promise?

JS本身是单线程的,在遇到某些方法或者是执行时间比较长的时候,这样后面的代码就会出现阻塞,无法继续运行。(就会造成页面的卡顿,影响用户体验)。

promise的使用——代码示例
let p=new Promise((resolve,reject)=>{
    // resolve("resolved")
    // reject("rejected")
});
p.then((res)=>{
    console.log(res)//resolved
}).catch((err)=>{
    console.log(err)//rejected
});
resolve和reject(可结合上面的代码段)

promise的构造函数里直接传入了一个函数,我们可一称他为executor,两个参数resolve和reject,executor会立即异步执行,函数内可以写自己的代码逻辑,根据代码执行逻辑,一般成功会调用resolve,失败调用reject,改变状态,状态一经改变不可逆。

resolve:

会把promise的pending(准备态)变为resolved(成功态)。

reject:

会把promise的pending(准备态)变为rejected(失败态)。

then和catch(可结合上面代码段)

then:

当promise的状态为resolved(成功态)时,会调用then方法里面的函数接受一个参数,也就是resolve()传入的值。

catch:

当promise的状态为rejected(失败态)时,会调用catch方法里面的函数接受一个参数,也就是reject()传入的值。

promise中的all方法
	let p1=Promise.resolve("p1成功");
	let p2=Promise.resolve("p2成功");
	let pAl=Promise.all([p1,p2]);
	pAl.then((res)=>{
	    console.log(res);//['p1成功','p2成功']
	    console.log("全部成功");
	}).catch((err)=>{
	    console.log(err);//这里打印第一个状态值为失败态的返回值
	    console.log("没有全部成功");
	});

all方法的参数是一个promise对象数组,数组中的promise对象状态全部都为resolved,该对象的状态就是resolved,then中的函数获取的参数值为数组,是all方法里传的所有的promise对象返回的值拼接的数组,否则就是rejected,catch中的值返回第一个promise对象的失败状态的返回值。

promise中的race方法
	let p1=Promise.resolve("p1成功");
	let p2=new Promise((resolve,reject)=>{
	    setTimeout(() => {
	        resolve('p2成功')
	    }, 200);
	});
	
	let pRace=Promise.race([p1,p2]);
	pRace.then((res)=>{
	    console.log(res)
	}).catch((err)=>{
	    console.log(err)
	});

race方法的参数是一个promise对象数组,数组中所有的promise对象中执行最快的一个,不论状态成功还是失败,该对象就为何种状态,then和catch就与其对应。

假如你看到了这里,文章对你有帮助的话,希望能帮忙点个赞哦,小破船谢谢大家了。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值