gpt4 book ai didi

javascript - 如何 "cancel/abort"已经触发的异步任务的副作用?

转载 作者:行者123 更新时间:2023-12-05 06:09:05 24 4
gpt4 key购买 nike

let state = 'A'

async function runTask() {
state = await someApi()
}

// `someApi`'s execution time may vary, as well as its response.
  1. 初始状态是A,然后调用runTask
  2. 由于某种原因,runTask 在上一次调用结束之前再次调用。
  3. someApi 的第二次调用以响应 C 解析,并且相应地更新状态。
  4. someApi 的首次调用以响应 B 解析,并且相应地更新状态,这是不可取的。
time  state

| A
| A --- runTask
| A someApi(call #1)
| A |
| A |
| A ------------------------ runTask (get called before previous one settles)
| A | someApi(call #2)
| A | ‖
| A | ‖
| A | v
| C --------------------- response #2: C
| C |
| C |
| C v
| B -- response #1: B
| B
| B
v

我应该如何在 javascript 中优雅地解决这个问题?我能想到的解决方法是:为每个请求分配时间戳并维护全局 lastUpdated 变量以防止任何过时和延迟的响应修改状态。但是,它感觉很脏,并且不能很好地扩展,因为通常有很多状态和异步操作。


更新

赏金奖励最早的好评。

最佳答案

解决此问题的一种模式是使用 mutex 来锁定对 runTask 的调用。

一些好的 nodejs 库可以做到这一点 https://www.npmjs.com/package/async-mutex

关于javascript - 如何 "cancel/abort"已经触发的异步任务的副作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64933965/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com