<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      使用try-finally結構執行狀態重置

      原代碼

      const commitForm = async () => {
        btnLoading.value = true;
        isCommitted.value = true;
        //過濾出顯示字段的列表
        let showFieldsList = [];
        for (let comp of compList.value) {
          if (comp.isShow) {
            showFieldsList.push(comp);
          }
        }
      
        //必填校驗
        for (let comp of showFieldsList) {
          if (comp.isRequired && comp.isShow) {
            if (comp.type === "showPic") {
              if (comp.picUrl) {
                formData.value[comp.prop] = comp.picUrl;
              }
            } else if (comp.type === "subForm") {
              const subForm = comp.subForm;
              if (subForm) {
                // 子表單必填字段列表
                let propList = [];
                for (let subComp of subForm) {
                  if (subComp.isConfigRequired) {
                    propList.push({
                      prop: subComp.prop,
                      label: subComp.label,
                    });
                  }
                }
                const subFormFillDataStr = formData.value[comp.prop];
                const subFormFillDataArr = JSON.parse(subFormFillDataStr ?? "[]");
                if (subFormFillDataArr.length === 0 && propList.length > 0) {
                  message.error(`請填寫子表單數據`);
                  return;
                }
                for (let item of propList) {
                  for (let subFormFillData of subFormFillDataArr) {
                    if ((subFormFillData[item.prop] ?? "") === "") {
                      message.warning(`${item.label}是必填字段`);
                      return;
                    }
                  }
                }
              }
            } else if (comp.type === "checkBox") {
              if (
                formData.value[comp.prop] == "others" ||
                (Array.isArray(formData.value[comp.prop]) &&
                  formData.value[comp.prop].length === 0) ||
                (formData.value[comp.prop] ?? "") === ""
              ) {
                message.warning(`${comp.label}是必填字段`);
                return;
              }
      
              if (
                formData.value[comp.prop].includes("others") &&
                !formData.value[comp.prop].some((item) => item.startsWith("others-"))
              ) {
                message.warning(`${comp.label}字段的其他選項勾選但未填寫`);
                return;
              }
            } else if ((formData.value[comp.prop] ?? "") === "") {
              message.warning(`${comp.label}是必填字段`);
              return;
            }
      
            //校驗手機號
            if (comp.isValidateTel) {
              if (!/^(?:(?:\+|00)86)?1[3-9]\d{9}$/.test(comp.sensitiveInfoTxt)) {
                message.warning(`${comp.label}格式錯誤`);
                return;
              }
            }
      
            // 正則表達式校驗
            if (comp.regExp && comp.regExp !== "") {
              const res = validateCompValue(comp);
              if (!res) {
                return;
              }
            }
      
            //相等校驗
            if (comp.sameValueAsCompValue) {
              if (
                formData.value[comp.prop] !==
                formData.value[comp.sameValueAsCompValue]
              ) {
                message.warning(`${comp.label}字段配置的兩次輸入內容不同`);
                return;
              }
            }
          }
        }
      
        const copyFormState = JSON.parse(JSON.stringify(formData.value));
        for (let comp of compList.value) {
          if (["checkBox", "dataBind"].includes(comp.type)) {
            if (Array.isArray(copyFormState[comp.prop])) {
              copyFormState[comp.prop] = copyFormState[comp.prop].join(",");
              copyFormState[comp.prop] = rearrangeOthers(copyFormState[comp.prop]);
            }
          }
      
          if (comp.type === "dateTime") {
            if (copyFormState[comp.prop]) {
              copyFormState[comp.prop] = dayjs(copyFormState[comp.prop]).format(
                "YYYY-MM-DD HH:mm"
              );
            }
          }
        }
      
        const res = await validateTryUpdateOrder(
          props.workConfCode,
          props.formWebUuid
        );
      
        if (res === "covered") {
          return;
        }
      
        const params = {
          workConfCode: props.workConfCode,
          parentOrderId: route.query.orderId,
          subFormWebUuid: props.formWebUuid,
        };
        SmartFormApi.subFormNewRecord(params, copyFormState)
          .then(async (result) => {
            if (result.data.code === 200) {
              message.success("已提交表單");
              emit("updateFormStatus", "已完成");
            } else {
              message.error(result.data.message);
              btnLoading.value = false;
              isCommitted.value = false;
            }
          })
          .catch((err) => {
            console.error(err);
            btnLoading.value = false;
            isCommitted.value = false;
          });
      };

      需要一進入這個函數就給按鈕置灰,防止重復提交,但是函數內部return很多。

      如果給每個return前都加上恢復按鈕正常功能,則會造成大量的工作量和代碼冗余,且不利于后續擴展。

      可以使用try-finally結構,將代碼改為

      const commitForm = async () => {
        btnLoading.value = true;
        isCommitted.value = true;
        
        try {
          //過濾出顯示字段的列表
          let showFieldsList = [];
          for (let comp of compList.value) {
            if (comp.isShow) {
              showFieldsList.push(comp);
            }
          }
      
          //必填校驗
          for (let comp of showFieldsList) {
            if (comp.isRequired && comp.isShow) {
              if (comp.type === "showPic") {
                if (comp.picUrl) {
                  formData.value[comp.prop] = comp.picUrl;
                }
              } else if (comp.type === "subForm") {
                const subForm = comp.subForm;
                if (subForm) {
                  // 子表單必填字段列表
                  let propList = [];
                  for (let subComp of subForm) {
                    if (subComp.isConfigRequired) {
                      propList.push({
                        prop: subComp.prop,
                        label: subComp.label,
                      });
                    }
                  }
                  const subFormFillDataStr = formData.value[comp.prop];
                  const subFormFillDataArr = JSON.parse(subFormFillDataStr ?? "[]");
                  if (subFormFillDataArr.length === 0 && propList.length > 0) {
                    message.error(`請填寫子表單數據`);
                    return; // 校驗失敗,退出執行
                  }
                  for (let item of propList) {
                    for (let subFormFillData of subFormFillDataArr) {
                      if ((subFormFillData[item.prop] ?? "") === "") {
                        message.warning(`${item.label}是必填字段`);
                        return; // 校驗失敗,退出執行
                      }
                    }
                  }
                }
              } else if (comp.type === "checkBox") {
                if (
                  formData.value[comp.prop] == "others" ||
                  (Array.isArray(formData.value[comp.prop]) &&
                    formData.value[comp.prop].length === 0) ||
                  (formData.value[comp.prop] ?? "") === ""
                ) {
                  message.warning(`${comp.label}是必填字段`);
                  return; // 校驗失敗,退出執行
                }
      
                if (
                  formData.value[comp.prop].includes("others") &&
                  !formData.value[comp.prop].some((item) => item.startsWith("others-"))
                ) {
                  message.warning(`${comp.label}字段的其他選項勾選但未填寫`);
                  return; // 校驗失敗,退出執行
                }
              } else if ((formData.value[comp.prop] ?? "") === "") {
                message.warning(`${comp.label}是必填字段`);
                return; // 校驗失敗,退出執行
              }
      
              //校驗手機號
              if (comp.isValidateTel) {
                if (!/^(?:(?:\+|00)86)?1[3-9]\d{9}$/.test(comp.sensitiveInfoTxt)) {
                  message.warning(`${comp.label}格式錯誤`);
                  return; // 校驗失敗,退出執行
                }
              }
      
              // 正則表達式校驗
              if (comp.regExp && comp.regExp !== "") {
                const res = validateCompValue(comp);
                if (!res) {
                  return; // 校驗失敗,退出執行
                }
              }
      
              //相等校驗
              if (comp.sameValueAsCompValue) {
                if (
                  formData.value[comp.prop] !==
                  formData.value[comp.sameValueAsCompValue]
                ) {
                  message.warning(`${comp.label}字段配置的兩次輸入內容不同`);
                  return; // 校驗失敗,退出執行
                }
              }
            }
          }
      
          const copyFormState = JSON.parse(JSON.stringify(formData.value));
          for (let comp of compList.value) {
            if (["checkBox", "dataBind"].includes(comp.type)) {
              if (Array.isArray(copyFormState[comp.prop])) {
                copyFormState[comp.prop] = copyFormState[comp.prop].join(",");
                copyFormState[comp.prop] = rearrangeOthers(copyFormState[comp.prop]);
              }
            }
      
            if (comp.type === "dateTime") {
              if (copyFormState[comp.prop]) {
                copyFormState[comp.prop] = dayjs(copyFormState[comp.prop]).format(
                  "YYYY-MM-DD HH:mm"
                );
              }
            }
          }
      
          const res = await validateTryUpdateOrder(
            props.workConfCode,
            props.formWebUuid
          );
      
          if (res === "covered") {
            return; // 校驗失敗,退出執行
          }
      
          const params = {
            workConfCode: props.workConfCode,
            parentOrderId: route.query.orderId,
            subFormWebUuid: props.formWebUuid,
          };
          await SmartFormApi.subFormNewRecord(params, copyFormState)
            .then((result) => {
              if (result.data.code === 200) {
                message.success("已提交表單");
                emit("updateFormStatus", "已完成");
              } else {
                message.error(result.data.message);
                // 接口返回錯誤,需要重置狀態
                throw new Error(result.data.message);
              }
            });
        } catch (err) {
          console.error(err);
        } finally {
          // 無論成功失敗,最終都重置狀態
          btnLoading.value = false;
          isCommitted.value = false;
        }
      };

      主要優化點說明:

      1. 使用 try-finally 結構,確保在任何情況下(包括所有 return 點)都會執行狀態重置

      2. 將所有校驗失敗的情況通過 return 退出,最終都會走到 finally 塊

      3. 接口調用失敗時通過 throw new Error 觸發 catch 塊,最終也會走到 finally 塊

      4. 成功提交后仍然會執行 finally 塊重置狀態,這符合業務邏輯

      這樣修改后,不需要在每個 return 前都寫狀態重置的代碼,既減少了重復代碼,也避免了遺漏重置狀態的情況。
       
      posted @ 2025-09-22 22:44  羅毅豪  閱讀(7)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 午夜福利国产精品视频| 四虎影视4hu4虎成人| 日韩深夜免费在线观看| 日日摸天天爽天天爽视频| 激情综合网激情国产av| 日韩一区二区三区av在线| 中文人妻| 久久亚洲精品中文字幕波多野结衣| 亚洲欧美在线观看品| 久久精品波多野结衣| 加勒比亚洲天堂午夜中文| 久久99精品久久久久麻豆| 精品少妇av蜜臀av| 亚洲色av天天天天天天| 最新永久免费AV无码网站| 日韩人妻一区中文字幕| 99网友自拍视频在线| 精品国产欧美一区二区三区在线 | 婷婷五月综合丁香在线| 三男一女吃奶添下面视频| 日韩 一区二区在线观看| 一本色道久久东京热| 午夜福利国产精品视频| 熟女人妻aⅴ一区二区三区电影 | 男人扒女人添高潮视频| 一本色道久久东京热| 国产亚洲精品久久久久婷婷图片 | 国产95在线 | 欧美| 国产在线无码精品无码| 亚洲理论在线A中文字幕| 我国产码在线观看av哈哈哈网站| 国产av仑乱内谢| 日99久9在线 | 免费| 亚洲少妇人妻无码视频| 国产真人性做爰久久网站| 亚洲人成电影网站 久久影视| 亚洲人成网站77777在线观看| 人妻少妇精品久久| 欧美牲交a欧美牲交aⅴ图片| 久久久亚洲欧洲日产国码αv| 日韩av在线不卡一区二区|