ES7异步函数解决进程等待相关业务问题

业务需求场景描述:

在接口只能单一检测的情况下,批量检测资源名称是否存在数据库,如果资源群中某一个资源已存在:给出交互让用户决定是否覆盖资源,最后形成不存在的资源和用户确定覆盖的资源群,进行提交。

业务关键:

1,单一检测存在异步操作

2,用户决定是否覆盖已存在资源,则需要程序等待效果

业务实现(基于Element-ui的$confirm确认消息提示组件):

/**
 * 使用ES7的异步函数解决进程等待问题
 * @param resourceArray  待检测资源群[name1,name2]
 * @returns [] 返回检测结果(不存在的资源和用户确认需要覆盖的资源)
 */
const loopCheckResName=async (resourceArray)=>{
  let resultRes=[];
  for(let i =0,len=resourceArray.length;i<len;i++){
    const curResName=resourceArray[i];
    const response=await this.$api.checkName(curResName);
    if(response.code===404){
        resultRes.push(curResName);
    }else{
      try{
        //这里会阻塞for循环,待用户确认
        await this.$confirm(`资源${curResName}已存在,是否覆盖?`);
        resultRes.push(curResName);
      }catch(e){
        console.log("用户放弃了覆盖")
      }
      
    }
  }
  return []
}

这里可能会有两个疑问:

1,为什么使用for循环,不使用forEach或者every?

2,为什么在循环提示时使用try...catch进行异常处理?

回答:

1,因为forEach和every内部的回掉函数本身是异步的

2,异步函数的异常只能使用try来进行处理,如果不进行异常处理将不会进入下一次循环,而是直接退出了for循环

具体牵扯到的知识点有兴趣可以去了解。这里只对当前业务场景进行解释

原文地址:https://www.cnblogs.com/Brose/p/es7_await.html