假设我有一个方法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.all
或Promise.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 }
}
这样,如果最重要的请求失败,那么你就不必担心回滚其他请求