promise是什么?
主要用于异步计算,可以将异步操作队列化,将异步操作以同步的操作的流程表达出来,按照期望的顺序进行执行。
我的问题
需求:
//调用第一个接口获得返回值
crudDept.getAlloVege(Cookies.get('deptId')
//调用第二个接口获取返回值
crudDept.getNotAlloVege(Cookies.get('deptId')
//获取两个接口返回值的合并
this.data = dataC.concat(dataN)
出现问题
如果什么都不操作,那么两个接口的调用是异步操作,那么响应顺序就是不可控的,返回的结果也是不可控的。就很难受。
解决办法
Promise.all([crudDept.getAlloVege(Cookies.get('deptId')),
crudDept.getNotAlloVege(Cookies.get('deptId'))]).then(res => {
res[0]....
res[1]...
//即可获取两个接口调用的返回值
//然后就可以拿到自己想要的结果
}
总结
用promise让异步操作,按照同步操作的流程去执行,得到自己想要的结果。
promise的其它内容
三个状态
1、pending[待定]初始状态
2、fulfilled[实现]操作成功
3、rejected[被否决]操作失败
Promise对象的状态改变,只有两种可能:
从pending变为fulfilled
从pending变为rejected。
promise状态一经改变,不会再变。
当promise状态发生改变,就会触发then()里的响应函数处理后续步骤;
.then
1、接收两个函数作为参数,分别代表fulfilled(成功)和rejected(失败)
2、.then()返回一个新的Promise实例,所以它可以链式调用
3、当前面的Promise状态改变时,.then()根据其最终状态,选择特定的状态响应函数执行
4、状态响应函数可以返回新的promise,或其他值,不返回值也可以我们可以认为它返回了一个null;
5、如果返回新的promise,那么下一级.then()会在新的promise状态改变之后执行
6、如果返回其他任何值,则会立即执行下一级.then()
.then()里面有.then()的情况
1、因为.then()返回的还是Promise实例
2、会等里面的then()执行完,再执行外面的
Promise的catch方法
catch 方法是 then(onFulfilled, onRejected) 方法当中 onRejected 函数的一个简单的写法,也就是说可以写成 then(fn).catch(fn),相当于 then(fn).then(null, fn)使用 catch 的写法比一般的写法更加清晰明确,其实可以类比成try/catch,这样,其中有报错的地方不会阻塞运行。比如定义了一个未定义wawa,正常来说它上面的代码也不会运行,因为被这个报错阻塞了,有了catch,它上面的代码可以正常运行下去
Promise的all方法
Promise.all可接受一个元素为Promise对象的数组作为参数,当这个数组里面的所有Promise对象都变为resolve时,该方法才会返回。
Promise的race方法
race的意思为赛跑,因此,promise.race也是传入一个数组,但是与promise.all不同的是,race只返回跑的快的值,也就是说result返回比较快执行的那个。