【问题标题】:Abort an Updates.fetchUpdateAsync() after a certain time [Expo/React native]在一定时间后中止 Updates.fetchUpdateAsync() [Expo/React native]
【发布时间】:2023-01-18 00:35:02
【问题描述】:
  1. Expo React Native SDK 版本:46
  2. 平台:Android/iOS
  3. 相关包裹:Expo.Updates

    大家好,我想以编程方式检查新更新,而不使用 app.json 中的 fallbackToCacheTimeout,它会在应用程序启动时触发对新更新的检查,因为那样我无法放置自定义加载页面。 因此,通过如下代码完成所有操作:

    try{
      const update = await Updates.checkForUpdateAsync();
      if(update.isAvailable){
          await Updates.fetchUpdateAsync();
          await Updates.reloadAsync();
      }else{}
    }catch(err){}
    

    但我希望能够在一定时间后中止所有这些呼叫(因此,连接不良的用户可以使用该应用程序而无需等待很长时间)。 我检查了documentation,但找不到任何允许这样做的方法。

    我不认为现在可以在 Javascript 中或任何连接中取消 Promise?

    还是 app.json 中的“fallbackToCacheTimeout”值会自动应用于 Expo API 的获取更新调用?

    有人知道该怎么做吗? :(

【问题讨论】:

  • 不,但它是做什么用的?我认为 FetchAsync 函数不会抛出错误。它只是被阻止,等待连接或下载。为了避免长时间等待,我在图像上使用对我自己的服务器的提取调用并尝试确定网络速度,然后我允许下载

标签: react-native expo expo-updates


【解决方案1】:

首先,我假设您在app.jsonapp.config.js 文件中将updates.checkautomatically 字段设置为ON_ERROR_RECOVERY。如果没有,请查看documentation。你需要这个的原因是为了避免自动更新,这也会在启动画面上阻止你的应用程序。

现在,为了中止或绕过承诺,即在您的情况下为 Updates.fetchUpdateAsync。你基本上可以在你想要的任何持续时间之后在 setTimeout 中抛出一个 Error,这样 catch 块将被执行,绕过承诺。

这是代码:

try{
  const update = await Updates.checkForUpdateAsync();
  if(update.isAvailable){
      // Throw error after 10 seconds.
      const timeout = setTimeout(() => throw Error("Unable to fetch updates. Skipping.."), 10000)

      await Updates.fetchUpdateAsync();

      // Just cancel the above timeout so, no error is thrown.
      clearTimeout(timeout)

      await Updates.reloadAsync();
  }else{}
}catch(err){}

请参考此 section 以了解在轻松更新中使用 fallbackToCacheTimeout

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 2020-04-16
    • 2022-06-21
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多