Javascript 执行相关异步任务时,流程应该是什么?
假设我有一个方法Javascript 执行相关异步任务时,流程应该是什么?,javascript,asynchronous,async-await,request,data-consistency,Javascript,Asynchronous,Async Await,Request,Data Consistency,假设我有一个方法updateRecord(),该方法在其中执行一些异步请求,其中一些请求比其他请求更重要,因为它们会影响硬件,而有些请求虽然必要,但只会影响数据库中的记录。所有这些信息的组合表示业务模型的一个操作 关于数据的可伪造性,该请求的顺序应该是什么?我应该先做所有不重要的事情(这可能不会失败),然后再做硬件(可能无法更新,因为它需要连接互联网,但这里保存的值是一天结束时唯一重要的值)?如果重要记录失败,我是否应该删除以前创建的记录 反过来说 还是其他方式 一些伪代码代表了我的困境: as
updateRecord()
,该方法在其中执行一些异步请求,其中一些请求比其他请求更重要,因为它们会影响硬件,而有些请求虽然必要,但只会影响数据库中的记录。所有这些信息的组合表示业务模型的一个操作
关于数据的可伪造性,该请求的顺序应该是什么?我应该先做所有不重要的事情(这可能不会失败),然后再做硬件(可能无法更新,因为它需要连接互联网,但这里保存的值是一天结束时唯一重要的值)?如果重要记录失败,我是否应该删除以前创建的记录
反过来说
还是其他方式
一些伪代码代表了我的困境:
async updateRecord(){
a = await setLogOfCurrentData()
if (a) { do something }
b = await updateARecordInDB()
if (a) { do something }
c = await updateImportantInfoInHardware()
if (!c) {
???
}
}
谢谢大家!
附言:不知道如何正确标记这个问题,如果你有一些想法让我知道 顺序可能并不重要。如果:
- 一个或多个请求需要大量带宽(下载或上传),因此要传输的数据量会干扰其他请求。在这种情况下,如果这是一项不太重要的任务,您可能希望要么推迟这个昂贵的请求,直到其他任务完成
- 或者,如果您有很多请求,并且端点是使用HTTP 1.1的服务器,那么最好先以小批量发送最重要的请求,然后在完成后再发送请求。这是因为在HTTP 1.1上,浏览器/操作系统限制了大量并发请求
do something
块彼此不相关,并且您没有使用大量带宽,那么更好的方法是使用Promise.all
,这样它们可以更快地完成,而不必等待前一个请求完成
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()。然后(handleLogResult)
)如果我没有正确理解您的问题,很抱歉
我想你是说,如果这个重要的请求失败,你想回滚更改吗
如果是这样的话,那么像这样的事情呢:
async updateRecord(){
//首先提出这个重要的要求
c=等待更新PortantiFoinHardware()
如果(!c){
//在这里抛出错误
}
a=等待setLogOfCurrentData()
如果(a){做某事}
b=等待更新记录b()
如果(a){做某事}
}
这样,如果最重要的请求失败,您就不必担心回滚其他请求