众所周知,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.以此类推,直到所有请求都有返回为止。
    代码:

    1. //使用Promise封装多个axios请求
    2. new Promise((resolve,reject) => {
    3. //第一个axios请求
    4. axios.get('https://movie.douban.com/chart').then((response) => {
    5. let $ = cheerio.load(response.data) // $是一个函数类型,用于处理cheerio接管的内容
    6. //通过$选择器,选择需要获得的页面内容。
    7. $(".types a").each((index, elem) => {
    8. let t = $(elem).attr('href')
    9. t = encodeURI('movie.douban.com' + t)
    10. a.push(t)
    11. })
    12. //通过resolve传递给下一次请求
    13. resolve(a)
    14. })
    15. }).then(data => {
    16. //接收上一轮传来的数据
    17. let src = data[i]
    18. axios.get(src).then((response) => {
    19. let $ = cheerio.load(response.data) // $是一个函数类型,用于处理cheerio接管的内容
    20. /*.......各种处理代码*/
    21. return res //将结果传递给下一轮
    22. })
    23. }).then(()={
    24. // 下一轮处理....
    25. })

    结果就是:在单页面上可以发起多个axios请求,并且他们是有序的