循环调用接口---批量处理数据

320 阅读1分钟

场景:需求批量选中列表中的那条数进行处理,这种问题可能后端服务帮我们处理好了,我们只需传入约定好的数据集,例如:ids=['123','456'....],但是如果后端不支持批量处理,可能就需要前端的来处理。

处理思路,首先想到采用promise.all

1.promise.all处理多个异步调用

function ajax() {
    let data = [{ name: '红红', age: 2 }, { name: '张张', age: 8 }]
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve(data)
      }, 200)
    })
  }
  创建Promise方法
  function createPromise() {
    let promise = new Promise((resolve, reject) => {
    //将业务接口的返回值,resolve进去
      ajax().then((res) => {
        resolve(res)
      })
    })
    return promise
  }
  
  function runBatch() {
    let userList = [{ id: 1 }, { id: 2 }];
    let list = [];
    let resList = [];
    userList.forEach((item) => {
      list.push(createPromise())
    })
    Promise.all(list).then((res) => {
      resList = res
    })
  }
  runBatch()

但是写完发现,无法实现我的需求,我的需求是当用户处理完所有数据后,再对处理结果,进行反馈,找出没有处理成功的,展示出来。然后promise.all在处理异步请求的时候,如果有一个接口异常就不会继续执行,会阻塞。Promise.all得等所有请求响应,等所有请求成功,响应时间太长问题。所以这时候我需要采用别的方式处理,我想到了递归。

2.采用递归处理多个异步调用

// 批量处理数据 demo
function ajax() {
    let data = [{ name: '红红', age: 2 }, { name: '张张', age: 8 }]
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve(data)
      }, 200)
    })
  }
  
 递归终止条件,数组长度小于等于1

  async function runBatch(length, arr) {
    const res = await ajax();
    arr.push(res)
    if (length> 1) {
      await runBatch(length- 1, arr) // 可以保证每一条数据都能执行
    }
    return arr
  }

  async function getResult() {

    let userList = [{ id: 1 }, { id: 2 }];

    let resList = await runBatch(userList.length, []);

  }
  getResult()
  ....
  然后通过分析resList,来展示批处理数据后的结果