Vue3前端异步方法调用的执行顺序问题

在下面的节点单击事件方法中调用了getSheetNum()这个方法,由于这个方法每触发一次就向后台传参查询一次,所以每次执行顺序        

/** 节点单击事件 */
 function handleNodeClick(data) {
    let cascadeIds = data.cascadeIds.split("-");
    sheetNumbers.value = null;
    queryParams.value.domainName= null;
    queryParams.value.subMod = null;
    if(cascadeIds[0]){
      console.log("一级")
      queryParams.value.domainName =cascadeIds[0];
    }
    if(cascadeIds[1]){
      // 二级
      console.log("二级")
      getSheetNum(cascadeIds[1]).then(response => {
        sheetNumbers.value = [];
        response.data.forEach((n) => sheetNumbers.value.push(n));
      });

      console.log("2optionSheetNumbers.value = " + optionSheetNumbers.value);
      console.log("2optionSheetNumbers.value = " + optionSheetNumbers.value);
    }
    if(cascadeIds[2]){
      // 三级
      console.log("三级")
      queryParams.value.subMod = cascadeIds[2];
      sheetNumbers.value = cascadeIds[1]

      console.log("3optionSheetNumbers.value = " + optionSheetNumbers.value);
      console.log("3optionSheetNumbers.value = " + optionSheetNumbers.value);
    }
    getList();
  };
/** 查询页码展示框所有页码*/  
function getSheetNum(sheetNumber) {
    return getSheetNumbers(sheetNumber).then(response => {
      optionSheetNumbers.value = [];
      response.data.forEach((n) => optionSheetNumbers.value.push(n));
      return response; // 返回 response
    });
  }

        如果需要让 getSheetNum() 函数在 handleNodeClick() 方法内先于后续代码调用,那么可以使用 async/await 或 Promise 链式调用的方式来解决这个问题。

首先,修改 handleNodeClick() 方法为一个异步函数,在需要等待异步操作结束的地方添加 await 关键字。同时,将 getSheetNum() 方法的返回值声明为一个变量并添加 await 关键字,以确保获取到异步方法的返回结果后再执行下一步操作。

以下是使用 async/await 的示例代码:

async function handleNodeClick(data) {
  let cascadeIds = data.cascadeIds.split("-");
  sheetNumbers.value = null;
  queryParams.value.domainName = null;
  queryParams.value.subMod = null;

  if (cascadeIds[0]) {
    console.log("一级")
    queryParams.value.domainName = cascadeIds[0];
  }
  if (cascadeIds[1]) {
    // 二级
    console.log("二级")
    const response = await getSheetNum(cascadeIds[1]);
    sheetNumbers.value = [];
    response.data.forEach((n) => sheetNumbers.value.push(n));

    console.log("2optionSheetNumbers.value = " + optionSheetNumbers.value);
    console.log("2optionSheetNumbers.value = " + optionSheetNumbers.value);
  }
  if (cascadeIds[2]) {
    // 三级
    console.log("三级")
    queryParams.value.subMod = cascadeIds[2];
    sheetNumbers.value = cascadeIds[1]

    console.log("3optionSheetNumbers.value = " + optionSheetNumbers.value);
    console.log("3optionSheetNumbers.value = " + optionSheetNumbers.value);
  }
  getList();
};

        如果你不想使用 async/await,可以使用 Promise 的链式调用方式,将后续代码全部写在一个 .then() 回调中,并在第一个 .then() 回调中获取到异步方法的返回结果。

以下是使用 Promise 链式调用的示例代码:

function handleNodeClick(data) {
  let cascadeIds = data.cascadeIds.split("-");
  sheetNumbers.value = null;
  queryParams.value.domainName = null;
  queryParams.value.subMod = null;

  if (cascadeIds[0]) {
    console.log("一级")
    queryParams.value.domainName = cascadeIds[0];
  }

  if (cascadeIds[1]) {
    // 二级
    console.log("二级")
    getSheetNum(cascadeIds[1])
      .then(response => {
        sheetNumbers.value = [];
        response.data.forEach((n) => sheetNumbers.value.push(n));

        console.log("2optionSheetNumbers.value = " + optionSheetNumbers.value);
        console.log("2optionSheetNumbers.value = " + optionSheetNumbers.value);

        return response;
      })
      .then(response => {
        // 后续代码全部写在这里
        if (cascadeIds[2]) {
          // 三级
          console.log("三级")
          queryParams.value.subMod = cascadeIds[2];
          sheetNumbers.value = cascadeIds[1]

          console.log("3optionSheetNumbers.value = " + optionSheetNumbers.value);
          console.log("3optionSheetNumbers.value = " + optionSheetNumbers.value);
        }
        getList();
      });
  } else {
    // 不需要调用 getSheetNum() 的情况
    getList();
  }
}

注意,在使用 Promise 链式调用的情况下,需要在最后一个 .then() 回调中执行 getList() 函数或其他需要在异步操作结束后执行的代码。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值