el-tree树形结构递归调用Promise

文章介绍了如何使用递归调用Promise解决在查询el-tree树形结构时,从多层接口获取数据并处理loading的问题,以提高搜索效率。作者提供了两个版本的示例,一个是基础版,另一个更符合业务场景,涉及异步请求和数据合并。
摘要由CSDN通过智能技术生成

这是递归调用Promise的案例,用于查询el-tree树形结构。之前是用懒加载做,导致接口只能一层一层的查,每次只返回一层数据,后面需要改成前几层通过接口多次查回来,方便搜索,那么在查的时候需要loading,多次查就要知道什么时候结束,这是第一版案例!

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body></body>
  <script>
    function api() {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          let arr = [{ name: "1" }, { name: "2" }];
          resolve(arr);
        }, 2000);
      });
    }

    function recursivePromise(i = 0) {
      // 递归的终止条件
      if (i <= 0) {
        return Promise.resolve(i);
      }
      // 返回一个Promise
      return new Promise(async (resolve, reject) => {
        await api();
        console.log(`当前值为 ${i}`);
        resolve(recursivePromise(i - 1)); // 递归调用
      });
    }

    function get(i = 1) {
      console.log(`${i}轮开始`);
      // 递归的终止条件
      if (i == 2) {
        return Promise.resolve(i);
      }
      i++;
      return new Promise(async (resolve, reject) => {
        const arr = await api();
        // 使用.then获取最后的结果
        recursivePromise(arr.length).then((res) => {
          console.log(`${i}轮结束`);
          resolve(get(i));
        });
      });
    }

    get().then(() => {
      console.log("终于完了!");
    });
  </script>
</html>

再来一版更符合业务场景的

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body></body>
  <script>
    // 模拟异步请求,两次返回不一样的数据
    function api() {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          let arr = [{ name: "1" }, { name: "2" }];
          resolve(arr);
        }, 2000);
      });
    }
    function api2() {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          let arr = [{ name: "1" }, { name: "2" }, { name: "3" }];
          resolve(arr);
        }, 2000);
      });
    }
    // 递归调用保证一层全部执行完成,把结果给上一层判断是否还要递归
    let narr = [];
    async function recursivePromise(arr, index = 0) {
      if (index < arr.length) {
        let res = await api2();
        narr = [...narr, ...res];
        index++;
        console.log(`请求了 ${index}`);
        // 在处理完当前元素后,递归调用以处理下一个元素
        return recursivePromise(arr, index);
      } else {
        // 所有元素都已处理完毕,返回一个 resolved Promise 给上级
        return Promise.resolve(narr);
      }
    }
    // 确定递归几层 i是要循环几层 这里i=2,因为模拟两层
    function get(dataArr, i = 0) {
      // 递归的终止条件
      if ( i == 2) {
        return Promise.resolve(i);
      }
      return new Promise(async (resolve, reject) => {  
        i++;
        console.log(`${i}轮开始`);
        console.log(`${i}轮有${dataArr.length}条数据`);
        recursivePromise(dataArr).then((res) => {
          console.log(`${i}轮结束`);
          console.log(`${i}轮共返回了${res.length}条数据`);
          resolve(get(res, i));
        });
      });
    }
    // 确定所以函数执行完
    async function init() {
      // 初始化查一次

      const arr = await api();
      get(arr).then(() => {
        console.log("终于完了!");
      });
    }
    init();
  </script>
</html>
JavaScript 中,可以使用 Promise 递归调用来处理需要按顺序执行的异步操作。递归调用 Promise 可以在一个 Promise 被解决后再执行下一个 Promise。 下面是一个使用 Promise 递归调用的示例: ```javascript // 模拟异步操作 function asyncOperation(value) { return new Promise(resolve => { setTimeout(() => { console.log(value); resolve(); }, 1000); }); } // 递归调用 Promise function recursivePromise(values) { if (values.length === 0) { return Promise.resolve(); } const value = values.shift(); return asyncOperation(value).then(() => recursivePromise(values)); } // 示例使用 const values = [1, 2, 3, 4, 5]; recursivePromise(values) .then(() => { console.log('All promises resolved'); }) .catch(error => { console.error('An error occurred:', error); }); ``` 在这个示例中,`asyncOperation` 函数模拟了一个异步操作,它返回一个 Promise,在一秒后打印传入的值并解决 Promise。`recursivePromise` 函数接收一个值数组,并递归地执行每个值对应的异步操作。当所有的异步操作都完成后,最终的 Promise 对象将解决。 在示例中,值数组 `[1, 2, 3, 4, 5]` 依次被传入 `asyncOperation` 函数,并按顺序执行。最终,当所有的异步操作都完成后,`recursivePromise` 函数返回的 Promise 对象将解决,然后可以在 `.then` 方法中执行下一步操作。 请注意,在实际的应用中,递归调用 Promise 时应该小心处理终止条件和错误处理,以避免出现无限递归或其他问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值