一、Promise是什么?
promise是对象,它的状态不受外界影响,代表一个异步操作
二、异步的操作由哪些?
优点:
promise对象,可以将异步操作以同步操作流程表达出来,避免了层层嵌套的回调函数,解决回调地狱的问题,用法上链式调用
缺点:
1.无法取消promise,一旦新建就会立即执行,无法中途取消<br /> 2.不设置回调函数,promise内部抛出的错误,反应不到外部<br /> 3.pendding状态时,无法得知进展到哪一个阶段
五、promise的原型对象(实例)
```javascript let p1= new Promise() p1.then()//接收成功的回调 p1.then(res(接收成功的信息),error(接收失败的信息)) p1.catch()//接收错误的回调 p1.catch(res(接收成功的信息),error(接收失败的信息)) p1.finally()//无论成功失败,都会触发
<a name="klGf1"></a>#### 六、promise构造函数上的方法,不能用实例来调用- Promise.all()```javascript多个promise实例包装成一个实例,所有的状态都成功才会调用.then,只要由一个不成功就会调用.catch()Promise.all([axios.get('轮播图'),axios.get('列表')]).then(res=>{res[0]//轮播图res[1]//列表})-------------------------------------------------------------------------------------------function water() {return new Promise((resolve, reject) => {setTimeout(() => {resolve("烧水");//成功}, 1000);});}function cut() {return new Promise((resolve, reject) => {setTimeout(() => {reject("切菜");//错误}, 1000);});}Promise.all([water(), cut()]).then(res => {//烧水和切菜的结果都是resolve()成功的时候,Promise.all().then才会执行,有其中一个不成功,不执行console.log(res);});
- promise.race() ```javascript Promise.race([p1,p2,p3])接收的时数组,那个结果获取的快,就返回那个结果,无论结果是成功/失败 使用场景:
- 多台服务器部署同样的服务端代码,假设要获取商品列表的接口
- 在race中写上所有服务器中的查询商品列表的接口地址,那个服务器响应快,就从那个服务器拿数据。
function water() {return new Promise((resolve, reject) => {setTimeout(() => {resolve("烧水");}, 2000);});}function cut() {return new Promise((resolve, reject) => {setTimeout(() => {resolve("切菜");}, 1000);});}Promise.race([water(), cut()]).then(res => {//哪一个结果返回的快,就返回那个结果。console.log(res);['切菜','烧水']});
- promise.resolve()- promise.reject()```javascriptlet p=new Promise((resolve,reject)=>{// resolve('成功')reject('失败')})console.log(p);// Promise {<rejected>: "失败"}p.then(res=>{console.log(res);}).catch(error=>{console.log(error);})结论:状态只能从pendding-->成功||pendding-->失败console.dir(Promise)可以获取到Promise构造函数上的属性和方法console.log()会在浏览器控制台打印出相关信息
举例:闯关消消乐
<script>function play(timer, key = 1) {return new Promise((resolve, reject) => {setTimeout(() => {key++; //第二关的要是resolve('成功的信息');reject('失败的信息')}, timer);});}play(1000).then(two => {console.log('第二关的钥匙',two);return play(2000, two);//第三关能用,否则接收不到参数}).then(three=>{console.log(`第三关的钥匙 ${three}`);// return play(3000,three)}).catch(error=>{console.log(error);//只有状态是失败的时候,才走error});</script>
七、简单封装promise
<script>class MyPromise {constructor(callback) {this.status = "pending"; //进行中this.val = ""; //成功的信息this.error = ""; //失败的信息// 成功的函数const resolve = val => {if (this.status === "pending") {this.status = "fulfiled"; //把状态变成成功this.val = val;}};// 失败的函数const reject = error => {if (this.status === "pending") {this.status = "rejected"; //让状态等于失败this.error = error;}};callback(resolve, reject); //一进来就触发}//成功的回调then(onResolve, onFail) {// onResolve(this.val);if (this.status === "fulfiled") {onResolve(this.val);} else {onFail(this.error);}}}let p = new MyPromise((resolve, reject) => {resolve("成功的信息"); //想更换结果,就修改这两个状态// reject("失败的信息");}).then(res => {console.log(res);},error => {console.log(error);});</script>
Promise.allSettled使用场景:首次进入的时候需要那个能返回数据就用那个,并且要对应证型下的高亮 知道那个是高亮的证型 会把所有场景的字段的接口都掉一次,let requestlist = []this.syndromeTypeData.forEach((item) => {requestlist.push(this.$Request.drivingSchool({url: this.$Port.drivingSchool.smallProject,method: 'post',data: { schoolId: store.getters['user/userInfo'].schoolId, syndromeType: item.label } //68}))})// TODO:requestlist接受的是一个数组Promise.allSettled(requestlist).then((res) => {res.forEach((item, index) => {//首次进入的时候需要那个能返回数据就用那个if (item.value && item.value.data && item.value.data.length) {this.syndrome = this.syndromeTypeData[index].labelitem.value.data.forEach((item) => {if (item.subject == 'subject2') {let { isMustFull, ...other } = itemthis.subject2Arr.push({isMustFull: isMustFull ? true : false,...other})} else {this.subject2Arr.push({isMustFull: isMustFull ? true : false,...other})}})//并且要对应证型下的高亮 知道那个是高亮的证型this.currentIndex = index}})})
