从优先级的错误中恢复
Recovering from errors from Priority
我是运行一段使用Priority-Web-SDK上传文件到Priority的代码。当一切都摆正时,它会按预期工作。 (上传文件,填写字段等)例如,当文件具有优先级不允许的扩展名时,uploadFile()
returns 会出现预期的错误。但是,后续命令失败并显示此消息:
A previous request has failed, causing all subsequent requests to fail
这样做的结果是,如果我有四个文件要上传,而第二个文件失败,我就无法上传接下来的两个文件。
这是导致我出现问题的循环:
for (let file of files) {
await baseForm.uploadFile(file, updateFileProgress)
.then((u) => uploadResult = u)
.then(() => baseForm.startSubForm(SUB_FORM))
.then((r) => subForm = r)
.then(() => subForm.newRow())
.then(() => subForm.fieldUpdate("EXTFILENAME", uploadResult.file))
.then(() => subForm.fieldUpdate("ORIG_FILENAME", file.name))
.then(() => subForm.saveRow(1)) //Close subForm
.catch((error) => {
baseForm.startSubForm(SUB_FORM)
.then((r) => subForm = r)
.then(() => subForm.newRow())
.then(() => subForm.fieldUpdate("ORIG_FILENAME", file.name))
.then(() => subForm.fieldUpdate("INTERNAL_ERR", "Upload Error: " + file.name + " " +error.message))
.then(() => subForm.saveRow(1)) //Close subForm
.catch((error2) => {
uploadEnd(file.name + ": " + error2.message)
})
})
}
*await 保持上传 运行 顺序。
*uploadEnd()
成功或失败时关闭程序
有没有办法在不从 login()
重新启动整个过程的情况下重置连接?
我正在回答我自己的问题,因为我能够在其他人插话之前找到解决方案...
这里同时发生了两件令人困惑的事情。 (我觉得...)
1) 主 catch()
同步运行
2) 主要 catch()
没有正确保存行或关闭子表单。这是抛出错误的问题,而不是,因为我认为 uploadFile()
抛出的错误得到了正确处理。
现在,事后看来,它们之间的联系似乎很紧密,解决了同步性问题也就解决了第二个问题。但是,我也认为只打开一次子窗体并关闭一次在语义上和操作上更正确。将 baseForm.startSubForm(SUB_FORM)
移动到表单循环之外可以解决这个问题。
一旦我明白 catch()
是同步运行的,添加另一个 async
和 await
就很简单了,代码现在可以按预期工作了:
.then(() => baseForm.startSubForm(SUB_FORM))
.then((r) => subForm = r)
.then(async () => {
for (let file of files) {
uploadFileStart(file);
await subForm.uploadFile(file, updateFileProgress)
.then((u) => uploadResult = u)
.then(() => subForm.newRow())
.then(() => subForm.fieldUpdate("EXTFILENAME", uploadResult.file))
.then(() => subForm.fieldUpdate("ORIG_FILENAME", file.name))
.then(() => subForm.saveRow()) //Do not close subForm
.catch(async (error) => {
await subForm.undo()
.then(() => subForm.newRow())
.then(() => subForm.fieldUpdate("ORIG_FILENAME", file.name))
.then(() => subForm.fieldUpdate("INTERNAL_ERR", "Upload Error: " + file.name + " " +error.message))
.then(() => subForm.saveRow()) //Do not close subForm
.catch((error2) => {
uploadEnd(file.name + ": " + error2.message)
})
})
}
})
.then(() => subForm.endCurrentForm()) //Close subForm
如果有任何有助于进一步简化代码的评论,我将不胜感激。
我是运行一段使用Priority-Web-SDK上传文件到Priority的代码。当一切都摆正时,它会按预期工作。 (上传文件,填写字段等)例如,当文件具有优先级不允许的扩展名时,uploadFile()
returns 会出现预期的错误。但是,后续命令失败并显示此消息:
A previous request has failed, causing all subsequent requests to fail
这样做的结果是,如果我有四个文件要上传,而第二个文件失败,我就无法上传接下来的两个文件。
这是导致我出现问题的循环:
for (let file of files) {
await baseForm.uploadFile(file, updateFileProgress)
.then((u) => uploadResult = u)
.then(() => baseForm.startSubForm(SUB_FORM))
.then((r) => subForm = r)
.then(() => subForm.newRow())
.then(() => subForm.fieldUpdate("EXTFILENAME", uploadResult.file))
.then(() => subForm.fieldUpdate("ORIG_FILENAME", file.name))
.then(() => subForm.saveRow(1)) //Close subForm
.catch((error) => {
baseForm.startSubForm(SUB_FORM)
.then((r) => subForm = r)
.then(() => subForm.newRow())
.then(() => subForm.fieldUpdate("ORIG_FILENAME", file.name))
.then(() => subForm.fieldUpdate("INTERNAL_ERR", "Upload Error: " + file.name + " " +error.message))
.then(() => subForm.saveRow(1)) //Close subForm
.catch((error2) => {
uploadEnd(file.name + ": " + error2.message)
})
})
}
*await 保持上传 运行 顺序。
*uploadEnd()
成功或失败时关闭程序
有没有办法在不从 login()
重新启动整个过程的情况下重置连接?
我正在回答我自己的问题,因为我能够在其他人插话之前找到解决方案...
这里同时发生了两件令人困惑的事情。 (我觉得...)
1) 主 catch()
同步运行
2) 主要 catch()
没有正确保存行或关闭子表单。这是抛出错误的问题,而不是,因为我认为 uploadFile()
抛出的错误得到了正确处理。
现在,事后看来,它们之间的联系似乎很紧密,解决了同步性问题也就解决了第二个问题。但是,我也认为只打开一次子窗体并关闭一次在语义上和操作上更正确。将 baseForm.startSubForm(SUB_FORM)
移动到表单循环之外可以解决这个问题。
一旦我明白 catch()
是同步运行的,添加另一个 async
和 await
就很简单了,代码现在可以按预期工作了:
.then(() => baseForm.startSubForm(SUB_FORM))
.then((r) => subForm = r)
.then(async () => {
for (let file of files) {
uploadFileStart(file);
await subForm.uploadFile(file, updateFileProgress)
.then((u) => uploadResult = u)
.then(() => subForm.newRow())
.then(() => subForm.fieldUpdate("EXTFILENAME", uploadResult.file))
.then(() => subForm.fieldUpdate("ORIG_FILENAME", file.name))
.then(() => subForm.saveRow()) //Do not close subForm
.catch(async (error) => {
await subForm.undo()
.then(() => subForm.newRow())
.then(() => subForm.fieldUpdate("ORIG_FILENAME", file.name))
.then(() => subForm.fieldUpdate("INTERNAL_ERR", "Upload Error: " + file.name + " " +error.message))
.then(() => subForm.saveRow()) //Do not close subForm
.catch((error2) => {
uploadEnd(file.name + ": " + error2.message)
})
})
}
})
.then(() => subForm.endCurrentForm()) //Close subForm
如果有任何有助于进一步简化代码的评论,我将不胜感激。