一个页面不同接口返回报错很多的情况下,只展示一条提示框

本文介绍了如何在前端开发中,通过封装单例提示信息框和利用http响应拦截器,处理同一个页面调用不同接口时可能出现的错误,确保用户界面在接口报错时仅显示一次警告,提升用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

同一个页面调不同的接口,如果接口报错的情况下,会返回很多报错信息,

这样用户体验感不太好,解决这个问题,包装一个单例的提示信息框

我们系统用的是vxeTable的modal弹框,其他的也是同理,可参考。

先封装方法 

/**
 * alert弹窗单例提示 如果已经有弹框则不再弹出
 * @param {*} content // 提示的内容
 * @param {*} title // 提示框的title
 * @param {*} status // 提示的状态 传值有:info warning question success error loading
 */
export const fmisAlertSingle = (title: string, content: string, status: any, okCallBack?: any) => {
  // 判断当前页是否有vxealert标签,如果没有则执行弹窗操作
  if (document.getElementsByClassName('vxe-modal-single').length === 0) {
    VXETable.modal
      .alert({
        title,
        content,
        status,
        zIndex: 3000,
        className: 'vxe-modal-single', // 自定义一个比较特殊的className
        destroyOnClose:true,
      })
      .then((resopnse) => {
        closeLoading();
        if (okCallBack && resopnse === 'confirm') {
          okCallBack();
        }
      });
  }
};

封装好的方法,在接口返回时,使用此方法

打开http.ts文件

http.interceptors.response.use(
  (response) => {
    // 返回时的其他操作 正常返回 
  },
  (error) => {
    //  返回错误时 
    const status = getValueByKeys(error, 'response.status', 500);
    const httpCodeLabel: IObject<string> = {
      400: '请求参数错误',
      401: '未授权,请登录',
      403: '拒绝访问',
      404: `请求地址出错: ${getValueByKeys(error, 'response.config.url', '')}`,
      408: '请求超时',
      500: 'API接口报500错误',
      501: '服务未实现',
      502: '网关错误',
      503: '服务不可用',
      504: '网关超时',
      505: 'HTTP版本不受支持',
    };
    if (error && error.response) {
      console.error('请求错误', error.response.data);
    }
    if (status === 401) {
      redirectLogin();
    } else if (status == 503) {
        // 用定时器变量 和 单例提示框共同实现
        if (timeOutFlag == 0) {
          fmisAlertSingle('提示消息', error.response , 'warning');
          timeOutFlag = 1;
          if (timerOut) {
            clearTimeout(timerOut);
          }
          timerOut = setTimeout(() => {
            timeOutFlag = 0;
          }, 3000);
        }
      }
    return Promise.reject(new Error(httpCodeLabel[status] || '接口错误'));
  }
);

以上就是在http里用定时器变量和单例提示框 共同实现 多个错误提示时 只展示一个框。

仅供参考~~

<think>我们正在处理一个关于Keil5工程移植时编译报错的问题。用户希望得到解决方案。根据引用内容,我们可以总结出几个常见的错误原因及解决方法:1.**C99标准或GNU扩展语法不兼容**(引用[1]):-问题:当工程依赖C99标准或GNU扩展语法(如复合字面量、变长数组等),而Keil5版本较低(如V5.14之前)或编译器配置未开启兼容模式时,会报错。-解决方案:手动配置编译器选项,开启C99模式或GNU扩展支持。具体步骤:在Keil5中,打开工程选项(OptionsforTarget),在“C/C++”选项卡中,将LanguageC设置为“c99”或勾选“GNUextensions”。2.**内嵌汇编报错**(引用[2]):-问题:在sys.c等文件中使用内联汇编时,如果使用`__asm("指令");`语法,但STM32的Cortex-M3核心使用Thumb-2指令集,而MDK的内联汇编仅支持ARM汇编,不支持Thumb或Thumb-2,因此会报错。-解决方案:改为使用内嵌汇编器(EmbeddedAssembler)的方式,即编写单独的汇编文件,或者使用内嵌汇编器支持的语法(如用`__asm`关键字后跟大括号包含多条指令)。示例:```c__asmvoidmy_function(void){NOPBXlr}```注意:在armccV5编译器下,这种写法是可行的。3.**库文件路径问题**(引用[3]):-问题:当通过QQ或微信等工具传输压缩包后解压,可能会多出一层同名目录,导致工程中配置的库文件路径错误。-解决方案:检查工程目录结构,将多余的上级目录重命名或移除,确保工程文件(.uvprojx)与源文件、库文件的相对路径正确。4.**CMSIS核心文件过时**(引用[4]):-问题:编译时可能因为core_cm3.h等核心文件过时而报错。-解决方案:从最新的STM32cube_FW软件包中(Drivers\CMSIS\Include目录下)获取cmsis_armcc.h、core_cm3.h、cmsis_armclang.h等文件,替换掉工程中的旧文件,并停用旧的core_cm3.c,改用CMSIS标准接口。此外,还可能遇到其他常见问题,例如:-**头文件路径未包含**:在工程选项的“C/C++”选项卡的“IncludePaths”中添加所有必要的头文件路径。-**宏定义缺失**:在“C/C++”选项卡的“Define”框中添加必要的宏,例如芯片型号`STM32F10X_HD`等。-**启动文件选择错误**:根据芯片型号选择正确的启动文件(如startup_stm32f10x_hd.s)。针对用户的问题,我们可以按照以下步骤进行排查和解决:**步骤1:检查Keil5版本和编译器配置**-确保Keil5版本在V5.14以上(如果版本低,建议升级)。-在OptionsforTarget->C/C++中,将LanguageC设置为“c99”,并勾选“GNUextensions”。**步骤2:处理内嵌汇编错误**-如果报错涉及内嵌汇编,检查汇编代码是否符合Thumb-2指令集,并按照引用[2]的建议修改。**步骤3:检查工程目录结构**-确认解压后的工程目录没有多余的上层目录,所有文件路径正确。**步骤4:更新CMSIS核心文件**-从最新的STM32Cube固件包中获取最新的核心文件,替换工程中的旧文件。**步骤5:检查包含路径和宏定义**-在OptionsforTarget->C/C++中,检查IncludePaths是否包含所有必要的目录。-检查Define中是否定义了正确的芯片型号以及需要的宏。**步骤6:检查启动文件**-确认启动文件与芯片型号匹配(如STM32F103系列的大容量芯片使用startup_stm32f10x_hd.s)。如果按照以上步骤仍然无法解决,请提供具体的错误信息,以便进一步分析。§§相关问题§§1.Keil5中如何配置编译器以支持C99标准?2.在Keil5中如何正确使用内嵌汇编?3.Keil5工程移植时如何正确设置头文件路径?4.如何更新Keil5工程中的CMSIS核心文件?5.Keil5编译时出现未定义符号错误,可能的原因是什么?</think>### Keil5工程移植编译报错解决方案 #### 常见错误及解决方法 1. **C99/GNU语法兼容性问题** - **现象**:报错`#error "Compiler generates FPU instructions for a device without an FPU"`或`expected expression`等。 - **原因**:工程依赖C99标准或GNU扩展语法(如复合字面量、变长数组),但编译器未开启兼容模式[^1]。 - **解决方案**: ```c // 手动配置编译器选项: 1. Project → Options for Target → C/C++ 选项卡 2. Language C 设置为 "c99" 3. 勾选 "GNU extensions" ``` 2. **内嵌汇编报错** - **现象**:`sys.c`文件报错`Invalid inline assembler statement`[^2]。 - **原因**:MDK内联汇编仅支持ARM指令,但STM32 Cortex-M使用Thumb-2指令。 - **解决方案**: ```c // 改为内嵌汇编器语法: __asm void SystemInit(void) { LDR R0, =0xE000ED88 // 示例指令 LDR R1, [R0] ORR R1, #(0xF << 20) STR R1, [R0] BX LR } ``` 3. **库文件路径错误** - **现象**:`fatal error: xxx.h: No such file or directory`[^3]。 - **原因**:解压后目录层级异常或路径配置错误。 - **解决方案**: ``` 1. 检查工程目录结构(如SDK文件夹是否在顶层) 2. Project → Options → C/C++ → Include Paths 添加所有头文件目录(如../Drivers/CMSIS/Include) ``` 4. **CMSIS核心文件过时** - **现象**:`undefined symbol __set_CONTROL`等核心函数报错[^4]。 - **解决方案**: ``` 1. 从STM32Cube_FW包获取更新: Drivers/CMSIS/Include/core_cm3.h Drivers/CMSIS/Include/cmsis_armcc.h 2. 替换工程中的旧文件 3. 停用core_cm3.c,改用CMSIS标准接口 ``` #### 通用排查流程 1. **检查编译器版本** `Project → Manage → Arm Compiler`确认是否为V5/V6 - V5需开启GNU扩展 - V6需添加`-Wno-legacy`编译参数 2. **重建工程索引** `Project → Rebuild all target files`彻底清理缓存 3. **检查设备支持包** `Pack Installer`中确认芯片支持包版本匹配 > **关键提示**:60%的移植错误源于路径配置问题,务必检查`Options for Target → Device`中芯片型号和启动文件是否匹配目标硬件[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值