You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native请求后UI不更新:进度条无法隐藏问题排查

React Native离线行为与错误处理异常问题

我在测试React Native应用的离线行为与错误处理,父组件通过条件渲染控制<TranslatingRecipesView>模态框的显示隐藏,模态框挂载时展示进度条,任务完成后自动关闭。

正常流程均符合预期,但模态框的catch语句else分支出现异常:

} catch (err) {   
      setShowTranslationProgress(false);
      if (err.message === noInternet) {
         Alert.alert(noInternet, noInternetMessage);
      } else {
         Alert.alert(ErrorCodeOthers);
      }

      i18n.changeLanguage(prevGlobalLanguageCode);
   }

触发noInternet错误(抛出普通Error)时,进度条会随弹窗正常隐藏;但触发其他错误(原是Axios错误,即使替换为普通Error)时,进度条仍停留在弹窗后方无法隐藏。日志显示状态已正确更新。

我已尝试以下方案:

  • 在catch块内调整setShowTranslationProgress(false)的位置
  • 将弹窗包裹在setTimeout中
  • 添加finally块并在其中调用setShowTranslationProgress(false)
  • 在抛出Axios错误时将其包装为普通Error
  • 不传递Axios错误,直接抛出普通Error
  • 强制父组件与模态框重新渲染
  • 缩短Axios请求超时时间
  • 使用模态框的visible属性替代父组件的条件渲染

错误触发位置如下,即使注释掉抛出Axios错误改为普通Error,问题仍存在:

static async getUnitOfMeasureTranslation(
    unitOfMeasureList: UnitOfMeasureModel[],
    targetLanguage: string
  ) {
    const unitOfMeasureData: any[] = [];
    unitOfMeasureList.map((unitOfMeasure) => {
      unitOfMeasureData.push({Text: unitOfMeasure.description});
    });
    const state = await NetInfo.fetch();
    if (state.isConnected) {
      try {
        const response = await this.getTranslation(
          unitOfMeasureData,
          targetLanguage
        );
        const translatedData = response.data;
        const updatedTranslatedData = unitOfMeasureList.map(
          (unitOfMeasure,index) => {
            return {
              ...unitOfMeasure,
              description: translatedData[index].translations[0].text,
              unique_id: unitOfMeasure.uom_id + '_' + targetLanguage,
              language: targetLanguage,
            };
          }
        );
        await createData(SchemaNames.UnitOfMeasureTranslationSchema,{
          title: 'UnitOfMeasure',
          data: updatedTranslatedData,
        });
        const mergedUnitOfMeasure = await this.mergeUnitOfMeasureTranslation();
        return mergedUnitOfMeasure;
      } catch(e) {
        console.log(`ERROR TRANSLATING UNIT OF MEASURE TO ${targetLanguage}:`,e);
        // throw e
        throw new Error(translationNoInternetMessage);
      } 
    } else {
      throw new Error(noInternet);
    }
  }

更新:在Axios请求前的try块内抛出错误,进度条可正常隐藏;但在请求后抛出错误则不行,推测问题与请求本身相关。

内容的提问来源于stack exchange,提问作者gabriellend

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:12:41