Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 执行相关异步任务时,流程应该是什么?_Javascript_Asynchronous_Async Await_Request_Data Consistency - Fatal编程技术网

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){做某事}
}
这样,如果最重要的请求失败,您就不必担心回滚其他请求