【发布时间】:2020-05-30 22:55:35
【问题描述】:
我有一系列从本地状态 S 读取的异步调用,根据其当前值执行一些计算,并返回本地状态 S' 的新更新值
所有这些都发生在运行时,所以我几乎无法控制这些操作的顺序。这是我所拥有的简化版本。
type State = {
state: number
}
let localState: State = {
state: 1000
}
const promiseTimeout = (time: number, value: number) => () => new Promise(
(resolve: (n: number) => void) => setTimeout(resolve, time, value + time)
);
const post: (n: number, currentState: State) => Promise<void> = (n, c) => promiseTimeout(n, c.state)()
.then(res => {
localState.state = res
console.log(localState)
})
post(1000, localState); // localState at call time is 1000
post(3000, localState); // localState at call time is still 1000
// when both promises resolve, the final value of localState will be 4000 instead of 5000
这个模型显然被破坏了,因为对post 的两次调用都将读取localState 的相同值,而它们应该按顺序执行。
如果所有调用都在编译时确定,我可以简单地有类似的东西
post(1000, localState)
.then(() => post(3000, localState)) // localState at call time is now 2000
我将如何解决这个问题?
【问题讨论】:
-
在运行时将所有承诺放入数组中,然后使用
Array.reducereturn [ task1, task2, task3, ].reduce((chain, task_i) => { }, initialPromise)之类的东西 -
您想按顺序执行,例如等待 1000 毫秒更新状态,然后等待 3000 毫秒更新状态?或者您希望它们并行运行?
-
@UchitKumar 无法正常工作,因为调用发生在运行时
-
@Max 他们需要按顺序运行
-
@UchitKumar - 我不确定你所说的“这种方法”是什么意思。无论有多少对
post的重叠调用,我们都不需要数组。
标签: javascript typescript asynchronous