Promise 重试,直到使用 Typescript 成功/失败

2024-01-24

我的移动应用程序会连续将多个文件上传到服务器,这些文件通常来自连接强度有问题的偏远地区。为此,我想尝试几次发送文件。我还想在失败时继续尝试下一个,导出结束时显示所有错误消息(即“已上传 10 个文件,3 个失败...”)

但是,我无法弄清楚带有承诺的递归重试模式。这是我到目前为止所拥有的:

sendFile(params, retries = 3){
    console.log("SENDING FILE: ", retries, "attempts remaining", params)

    return new Promise((resolve, reject)=>{
      if(retries > 0){
        this._sendFile(params)
        .then(()=>{
          // Upload Success
          console.log("Upload Success!")
          resolve()
        })
        .catch((err)=>{
          console.log("Upload Fail", err)
          // Retry
          this.sendFile(params, --retries)
        })
      }else{
        console.log("Failed 3 times!!!")
        //Record error
        this.exportStatus.errors.push({
          message:"A file failed to upload after 3 attempts.",
          params: params
        })

        //Resolve and move on to next export
        resolve()

      }
    })

  }

  _sendFile(params){

      // Mobile - File Transfer

        let options = {
          fileKey: "file_transfer",
          fileName: params.fileName,
          httpMethod: "PUT",
          chunkedMode: false,
          headers: {
            "x-user-email":this.settings.user.email,
            "x-user-token":this.settings.user.authentication_token,
          }
        }

        let fileTransfer = this.transfer.create()
        let url = encodeURI(this.settings.api_endpoint + params.url)

        return fileTransfer.upload(params.file, url, options, true)


  }

当我在服务器上引发异常时,我会看到“失败 3 次!!!”错误消息,但调用承诺无法解决导出的其余部分继续进行的问题。我相信这是因为我创建了嵌套的承诺(即每次重试都创建一个新的承诺)。如何在 3 次重试后让原来的 Promise 得到解决?

Thanks!


这是最终的工作结果:

  sendFile(params, retries = 3, promise = null){
    console.log("SENDING FILE: ", retries, "attempts remaining", params)

    if(retries > 0){
      return this._sendFile(params)
      .then(()=>{
        // Upload Success
        console.log("Upload Success!")
        return Promise.resolve(true)
      })
      .catch((err)=>{
        console.log("Upload Fail", err)

        this.exportStatus.retries++

        return this.sendFile(params, --retries) // <-- The important part
      })
    }else{
      console.log("Failed 3 times!!!")

      this.exportStatus.errors.push({
        message:"A file failed to upload after 3 attempts.",
        params: params
      })

      return Promise.resolve(false)

    }

  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Promise 重试,直到使用 Typescript 成功/失败 的相关文章

随机推荐

  • php如何限制用户每天登录一次以上

    有没有办法限制用户每天登录次数不超过一次 这在 PHP 中可能吗 如果是这样 你能指导我该怎么做吗 在我的数据库中 我有用户名和密码字段以及时间戳 我还应该添加什么 我尝试过这个 但问题是我不希望它受到限制IP并且应该尊重用户
  • 合并两个 xml 文件 LINQ

    我在合并两个 XML 文件时遇到问题 我将这两个文件加载到两个对象中 找到两个对象中的目标节点并尝试合并 这是一个示例 var nodes1 XResult1 Descendants subject var nodes2 XResult2
  • 静态只读字段初始值设定项与静态构造函数初始化

    以下是初始化静态只读字段的两种不同方法 这两种方法有区别吗 如果是 什么时候应该优先选择其中一个 class A private static readonly string connectionString WebConfiguratio
  • JPA。 JoinTable 和两个 JoinColumn

    我需要创建表 PORTATION MODEL SET 我需要从表 portation 创建两个密钥 从表phone model 创建一个密钥 我有代码 Entity Table name PORTATION SecondaryTable n
  • 为什么 Android Lint 在显式使用 Locale.US 时会警告 String.format 使用默认区域设置?

    我最初打电话String format这边走 return String format s f f anotherString doubleA doubleB 这使得 Android Lint 生成此警告 隐式使用默认区域设置是错误的常见来
  • 在 MongoDB 中,如何索引数组中的嵌入对象字段?

    多键的 mongodb 文档给出了查询数组中嵌入对象字段的示例 http www mongodb org display DOCS Multikeys http www mongodb org display DOCS Multikeys
  • 可垂直滚动的 GroupBox

    我正在使用创建一个应用程序Windows 申请表 我基本上是 C 和 Visual Studio 的新手 从昨天开始就一直在使用它 到目前为止 我已经成功创建了一个简单的表单 如屏幕截图所示 My Form 背景 细节 我正在使用框中提供的
  • 通过NotificationListenerService读取Google地图通知

    是否可以读取用户移动时定期显示的 Google 地图导航通知 例如 定期更新距下一回合的剩余距离 我尝试使用NotificationListenerService来实现此目的 但是当我尝试使用getNotifications getExtr
  • 使用react.js 在单页应用程序中导航

    我正在使用 React 和 Backbone 构建一个单页面应用程序 并试图找出处理应用程序中内容之间导航的最佳实践 我的应用程序将有一个侧边栏 其中包含链接 例如 照片 和 设置 侧边栏始终存在 因此单击 设置 后 我希望在不重新加载整个
  • TemporaryKey.pfx 出现问题 我没有密码

    我的一个客户有一个问题 他有一位 Microsoft CRM 开发人员 但他离开了 现在该项目仍未完成 我已经下载了自定义应用程序的源代码 并且我不想继续开发 我尝试过 ClickOne 部署 它会弹出一个与 myapp Temporary
  • ASP.NET Identity 2.1 将 PK 更改为 int 错误

    我已经按照中所述更改了 PKhttp www asp net identity overview extensibility change primary key for users in aspnet identity http www
  • 如何标记扩展宏(local :dir )?

    我知道我的标题令人困惑 因为tokenize命令被指定为一个字符串 我有许多文件夹 其中包含大量 独立的 命名不当的 Excel 文件 其中大部分是从网站上抓取的 手动选择不方便 需要依赖Stata扩展宏功能local dir阅读它们 我的
  • 如何像 Pinterest/Evernote 一样从 UICollectionView 过渡到 UIViewController

    我有一个 UICollectionView 当选择一个项目时 我希望它能够全屏显示动画 因此它会从单元格大小过渡到全屏并成为 UIViewController Pinterest 和 Evernote 都有这种行为 点击单元格会将单元格转换
  • jQuery 性能 - 按数据属性还是按类选择?

    哪个更快 为什么 选择 div 满足插件需求 div data something or div something 我倾向于前者 因为它 更干净 基于这个问题 https stackoverflow com questions 61795
  • Jquery - event.target 和 this 关键字之间的区别?

    有什么区别event target and this 假设我有 test click function e thisEventOb e target this this alert thisEventObj alert this 我知道警报
  • 您可以将 HTML 图像标签的 src 属性设置为控制器方法吗?

    我知道你可以做到这一点 img src http some svg on the web 但是如果我有一个带有注释的控制器方法怎么办 ResponseBody RequestMapping value getSVG public Respo
  • pygtk导入gtk错误

    我下载了中描述的所有内容 pygtk http www pygtk org 用于安装 一切都很顺利 直到我尝试打字 import gtk 它抛出了一个ImportError如下 from gtk import gtk ImportError
  • 如果进程被终止,写入 write() 的数据是否会刷新到磁盘?

    我正在使用一个程序qdbm http sourceforge net projects qdbm 维护键值存储 qdbm 链接到程序中 在某些情况下 该进程会在 qdbm 数据库中放入一个值 然后通过调用外部 init 脚本 通过 syst
  • Phonegap垂直滚动

    我正在为 ios 构建一个phonegap 应用程序 并且遇到垂直滚动问题 即使没有任何内容 网络视图中似乎也会有一些像素滚动 这会影响我在 html 中内置的绝对定位的导航栏和选项卡栏 这是我的 html 页面 没有内容 但我仍然得到图像
  • Promise 重试,直到使用 Typescript 成功/失败

    我的移动应用程序会连续将多个文件上传到服务器 这些文件通常来自连接强度有问题的偏远地区 为此 我想尝试几次发送文件 我还想在失败时继续尝试下一个 导出结束时显示所有错误消息 即 已上传 10 个文件 3 个失败 但是 我无法弄清楚带有承诺的