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

mik*_*agz 5 javascript typescript ionic-framework es6-promise ionic3

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


  }
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

mik*_*agz 5

这是最终的工作结果:

  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)

    }

  }
Run Code Online (Sandbox Code Playgroud)