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