问题背景:
在做项目的时候,需要开发票,后台返回给我一个发票数组,根据发票数组循环调用第三方(航天金税)提供的接口,等所有的接口数据返回了,再将所有的数据传递用客户端,进行开票。
逻辑分析
- 发票数组的长度是不固定的,需要循环请求接口
- 请求接口是异步的,需要保证拿到所有的返回数据再去开票
- 需要用到一个核心的方法Promise.all()
Promise.all()方法
Promise.all() 方法接收一个 promise 的 iterable 类型(注:Array,Map,Set 都属于 ES6 的 iterable 类型)的输入,并且只返回一个Promise实例,那个输入的所有 promise 的 resolve 回调的结果是一个数组。这个Promise的 resolve 回调执行是在所有输入的 promise 的 resolve 回调都结束,或者输入的 iterable 里没有 promise 了的时候。它的 reject 回调执行是,只要任何一个输入的 promise 的 reject 回调执行或者输入不合法的 promise 就会立即抛出错误,并且 reject 的是第一个抛出的错误信息。
代码实现
let invoiceList = [
{ name: 1, id: 1 },
{ name: 2, id: 2 },
{ name: 3, id: 3 }];
let makeInvoiceList = invoiceList.map(params => {
return new Promise((resolve, reject) => {
axios({
method: "get",
data: params
}).then(res => {
resolve(res);
});
});
});
Promise.all(makeInvoiceList).then(data=>{
goInvoice(data)
})
let goInvoice =(data)=>{
//调用客户端的开票逻辑
}