满口金牙 2022-01-06 17:04 采纳率: 91.5%
浏览 107
已结题

vue3 请教异步处理方法。我点太快,编号会重复

下而这段代码作用是, 复制表格中的最后一行数据,生成新一行
但是,复制多行时,我连续点击运行这段代码时,
点的速度太快时, 会出现几行相同的编号,慢着点没事
肯定异步造成的,怎么来处理这个异步

 // 复制增加一行,同上一行相同,并改变焦点
    async function addOne (index, row) {
      if(!Number(window.sessionStorage.getItem('allowAdd'))){
        alert('你没有新增数据的权限!')
        return
      }
      // 如果表格中有一行数据就复制
      if(data.searchResult.length>=1){
        const newRow = toRaw(data.searchResult.slice(-1)[0]) // 截取最后一行数据,生成新行
        const newAdd = JSON.parse(JSON.stringify(newRow)) // 深拷贝
        newAdd.id = nanoid()
        //----------------------------------------------------------------
        // 从后端获取 用定自定义的 编号规则
        let numberRules
        const params ={ branch_name: newAdd.branch_name, name: '编号'}
        await getMethod('number_rules/',params).then(res=>{
          numberRules = res[0].rules
        })
        // 获取后端数据库中最后一个编号
        if (numberRules.length>=1){
          let last_number
          await lastId(modData.modelName,newAdd.branch_name).then(res=>{
            last_number =res
          })
          // 用自定义函数,计算出新编号
          const newNumber1 = rulesComput(numberRules,last_number,newAdd)
          // 用当前复制行编号,计算出新编号
          const newNumber2 = rulesComput(numberRules,newAdd.serial_number,newAdd)
          // 比较两个编号,选择最大的为新编号
          if( newNumber1 > newNumber2 ){
            newAdd.serial_number = newNumber1
          }else{
            newAdd.serial_number = newNumber2
          }
        } 
   
        newAdd[modData.editField] = toRaw(newRow[modData.editField] + 1)
        newAdd.showCancel = true
        newAdd.showAddSave = true
        newAdd.showInput= true
        newAdd.is_active = null
        data.searchResult.push(newAdd)
        updateEelement(newAdd.id) // 移动光标位置
      
        // editFocus.value[ data.editField + newAdd.id ].focus()
      
      } else {
        errMessage('页面中最少要有一行数据,才能够复制','提示')
        return
      }
      async function updateEelement(id){
        await nextTick(()=>{
          editFocus.value[ modData.editField+ id ].focus()
        })
      }
      // 改变行数和页数
      page.totalCount = page.totalCount + 1 // 总行数
      page.pageCount = Math.ceil(data.searchResult.length / page.pageSize) // 总页数为当前页
      page.currentPage = page.pageCount // 显示到最后一页
    }

  • 写回答

8条回答 默认 最新

  • 前端阿彬 前端领域新星创作者 2022-01-06 18:40
    关注

    不是异步的问题,你已经是用了async语法糖,里面过程同步执行,只不过你点太快,上一次方法还没执行结束,数据库还没插入新的数据,然后后面点击获取的最后一个编号都是同一个。
    解决: 节流函数触发这个新增事件
    效果: 无论你怎么点,它都是以一定频率触发函数

    如有帮助,麻烦点个[采纳此答案]谢谢^O^

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

问题事件

  • 系统已结题 1月17日
  • 已采纳回答 1月9日
  • 创建了问题 1月6日

悬赏问题

  • ¥15 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 求螺旋焊缝的图像处理
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?
  • ¥15 网络通信安全解决方案
  • ¥50 yalmip+Gurobi
  • ¥20 win10修改放大文本以及缩放与布局后蓝屏无法正常进入桌面
  • ¥15 itunes恢复数据最后一步发生错误
  • ¥15 关于#windows#的问题:2024年5月15日的win11更新后资源管理器没有地址栏了顶部的地址栏和文件搜索都消失了