众所周知,axios和Promise这种异步处理不能和同步的循环语句(for或者while)一起使用,但在实际开发中有时我们会需要得到一个请求的结果之后,再次发起连续的请求,比如:
a.res -> b( a.res ) -> c( b(a.res) ),b请求依赖a请求获得的路径,c请求又依赖b请求获得的路径,此时就会出现一环套一环的情况,但是我们又不能用for或者while来循环的执行请求,怎么办?
答:使用Promise对象!用来封装多个axios请求
要知道axios封装的就是一个Promise对象,而Promise就是为了解决不断的回调而诞生的,它能让异步请求变得有序,可以让下一个请求等待上一个请求的结果,这就可以实现我们的需求了。虽然这样要写较多个axios请求,但是比起把每个axios都单独写一个文件要实惠的多,这一点在修改云数据库添的数据的时候尤其重要。
结果就是:在单页面上可以发起多个axios请求,并且他们是有序的
需求:第一个axios请求获得所有豆瓣分类的地址,第二个请求之后,依次向这些地址发起请求,直到所有地址都请求完毕为止。
1.通过Promise对象,封装axios请求,让请求结果用reslove保存传递给下一次的请求
2.下一次请求获得上一次请求的结果后,用该结果发起第二次请求,然后把索引修改到下一位发送给下一次请求
3.以此类推,直到所有请求都有返回为止。
代码:
//使用Promise封装多个axios请求
new Promise((resolve,reject) => {
//第一个axios请求
axios.get('https://movie.douban.com/chart').then((response) => {
let $ = cheerio.load(response.data) // $是一个函数类型,用于处理cheerio接管的内容
//通过$选择器,选择需要获得的页面内容。
$(".types a").each((index, elem) => {
let t = $(elem).attr('href')
t = encodeURI('movie.douban.com' + t)
a.push(t)
})
//通过resolve传递给下一次请求
resolve(a)
})
}).then(data => {
//接收上一轮传来的数据
let src = data[i]
axios.get(src).then((response) => {
let $ = cheerio.load(response.data) // $是一个函数类型,用于处理cheerio接管的内容
/*.......各种处理代码*/
return res //将结果传递给下一轮
})
}).then(()={
// 下一轮处理....
})
结果就是:在单页面上可以发起多个axios请求,并且他们是有序的