从优先级的错误中恢复

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() 是同步运行的,添加另一个 asyncawait 就很简单了,代码现在可以按预期工作了:

.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

如果有任何有助于进一步简化代码的评论,我将不胜感激。