比如你发个请求,下面这种就是典型的回调地狱,这种发请求的方式,都是只能上一个请求发完,才会进去发下一个
this.api.getdata().then(() => {
this.api.getdata1().then(() => {
})
})
但是你也可以这样写,这样请求就都是并发发送的了
this.api.getdata().then(() => {
})
this.api.getdata1().then(() => {
})
同样,如果你用promise.all也可以达到并发发送请求的作用,不过它相比而言有个好处,就是
Promise.all获得的成功结果的数组里面的数据顺序和Promise.all接收到的数组顺序是一致的,即p1的结果在前,即便p1的结果获取的比p2要晚。这带来了一个绝大的好处:在前端开发请求数据的过程中,偶尔会遇到发送多个请求并根据请求顺序获取和使用数据的场景,使用Promise.all毫无疑问可以解决这个问题,不过用async await也可以按顺序发请求。这篇文章写得还行https://www.jianshu.com/p/7e60fc1be1b2
对了,还有一道面试题,看到一个答案,感觉是对的
题目:利用Promise和 async/await实现以 下功能:现有一个接 口https://test.com/get?id=1, 需要发起id从1~200的GET方式调用200次异步请求,要求分20轮发出,前-轮全部完成后才进行下轮,每轮同时并发请求为10次
async function manyReqs() {
function getReq (url, data) {
return new Promise((resolve, reject) => {
axios.get(url, {
params: {
...data
}
}).then((res) => {
resolve(res);
}).catch((err) => {
reject(err);
})
})
}
const datas = [];
for (let i = 1; i <= 200; i++) {
datas.push({ id: i })
}
const url = 'https://test.com/get';
const promises = datas.map((data) => {
getReq(url, data);
})
let result = [];
for (let i = 9; i < 200; i += 10) {
const promisePart = promises.slice(i - 9, i + 1);
result = result.concat(await Promise.all(promisePart));
}
return result;
}