【问题标题】:What should be the flow when performing related async tasks?执行相关异步任务时的流程应该是什么?
【发布时间】:2021-04-13 16:46:41
【问题描述】:

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

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

反过来呢?

还是其他方式?

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

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

谢谢!

Ps:不知道如何正确标记这个问题,如果您有什么想法,请告诉我!

【问题讨论】:

    标签: javascript asynchronous async-await request data-consistency


    【解决方案1】:

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

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

    在您的情况下,如果请求是独立的 - 也就是说,如果 do something 块彼此不相关 - 并且您没有使用大量带宽,那么更好的方法是使用 @ 987654323@ 或 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)

    【讨论】:

      【解决方案2】:

      抱歉,如果我对您的问题的理解有误。

      我认为您是说如果此重要请求失败,您想回滚更改?

      如果是这样的话,那么这样的事情呢:

      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 }
      }
      
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多