执行相关异步任务时,流程应该是什么



假设我有一个方法updateRecord(),这个方法在其中执行一些异步请求,其中一些请求比其他请求更重要,因为它们会影响硬件,有些请求虽然必要,但只影响数据库中的记录。所有这些信息加在一起表示业务模型的一个操作。

关于数据的可验证性,这些请求的顺序应该是什么?我应该先做所有不重要的(可能不会失败(,然后再做硬件(可能无法更新,因为它需要互联网连接,但这里保存的值是一天结束时唯一重要的值(吗?如果重要的一个失败了,我应该删除之前创建的记录吗?

反过来?

或者其他方式?

一些伪代码来代表我的困境:

async updateRecord(){
a = await setLogOfCurrentData()
if (a) { do something }
b = await updateARecordInDB()
if (a) { do something }
c = await updateImportantInfoInHardware()
if (!c) { 
??? 
}
}

谢谢!

Ps:不知道如何正确地标记这个问题,如果你有一些想法,请告诉我!

顺序可能无关紧要。如果:

  • 一个或多个请求需要大量带宽(下载或上传(,因此要传输的数据量会干扰其他请求。在这种情况下,如果这是一项不太重要的任务,您可能希望将这个昂贵的请求推迟到其他请求完成
  • 或者,如果您有大量的请求,并且端点是使用HTTP1.1的服务器,那么最好先小批量发送最重要的请求,然后在完成后再发送请求。这是因为在HTTP1.1上,浏览器/操作系统会抑制大量并发请求

在您的情况下,如果请求是独立的,也就是说,如果do something块彼此不相关,并且您没有使用大量带宽,那么更好的方法是使用Promise.allPromise.allSettled,这样它们都可以更快地完成,而不必等待前一个请求完成。

function updateRecord() {
return Promise.allSettled([
setLogOfCurrentData(),
updateARecordInDB(),
updateImportantInfoInHardware(),
])
.then(([logResult, dbResult, hardwareResult]) => {
// do stuff with results
// those with errored will be of the form
// { status: 'rejected', reason: SomeErrorObject }
});
}

Promise.allSettled可能是最好的方法,因为这样可以单独检查每个结果。

(或者您可以使用Promise.all并将.then.catch处理程序放在每个Promise的末尾,例如setLogOfCurrentData().then(handleLogResult)(

如果我理解不正确,我很抱歉。

我想你是说,如果这个重要的请求失败,你想回滚更改吗?

如果是这样的话,那么像这样的东西呢:

async updateRecord(){
// Make this important request first
c = await updateImportantInfoInHardware()
if (!c) { 
// throw error here
}
a = await setLogOfCurrentData()
if (a) { do something }
b = await updateARecordInDB()
if (a) { do something }
}

这样,如果最重要的请求失败,那么你就不必担心回滚其他请求

最新更新