如何为这两个函数提供对共享数据的访问权限?

How can I give these two functions access to shared data?

提问人:713sean 提问时间:1/10/2023 最后编辑:713sean 更新时间:1/10/2023 访问量:41

问:

我有三个函数,和 。 触发计算密集型进程 。 应该尽早停止该过程。handleSubmithandleCancelsolveHandleSubmitsolvehandleCancel

我的简化代码如下所示:

function handleSubmit() {
  computeHeavyProcess();
}
function handleCancel() {
  // not sure what to put here, or how to design this
}
function solve() {
  while (computationNotDone) {
    // do computations
    setSolutionState(resultOfCurrentComputations); // update React state every iteration
    await sleep(0); // unblock UI by chunking compute
  }
}

我想进行以下互动:

  1. 当用户单击触发器时,计算开始。handleSubmit
  2. 计算运行,每隔一段时间更新一次状态,对计算进行分块并允许 UI 响应
  3. 如果用户点击触发器,则计算过程被终止。handleCancel

一种方法是使用一个全局变量 ,调用会将其设置为 false。然后,在里面,我可以检查.allowedToRunhandleCancelsolvewhile (computationNotDone && allowedToRun)

但是,我不想使用全局变量,因为我认为这表明我的代码设计得很差。

关于如何在没有全局变量的情况下设计这个系统的任何建议,我将不胜感激。

另外,我想导入 ,因此如果不将模块级变量包装在对象中,我就不能使用它,这是我想避免的。solve

JavaScript ReactJS 异步 闭包

评论

1赞 Robin Zigmond 1/10/2023
“如何更好地设计这个系统”是完全基于意见的,所以在 Stack Overflow 上并不是真正的主题。无论如何,这里缺少信息。如果一次安装多个组件的“副本”,会发生什么情况?如果应该只为所有这些更新一次,那么“全局”(我假设您的意思是模块级)变量似乎没问题。如果它对每个“副本”都是独立的,那么你应该改用 ref。computationNoDone
0赞 713sean 1/10/2023
嗨,罗宾,谢谢你的回复。我已经编辑了我帖子的底部问题,以更明确地措辞。我不会在任何时候安装两个组件。我还希望在此模块之外定义求解,并导入其中。这将不允许我使用模块级变量,除非我将其包装在一个对象中,我不想这样做,因为这似乎是不好的做法。
0赞 Robin Zigmond 1/10/2023
你不可能在 React 组件之外定义,假设是 返回的状态设置函数。至少不是你目前拥有的形式。如果你能把这个setter函数作为一个参数传入,它可能会起作用--但讨论再次达到了一个点,需要更详细地说明你需要做什么。我无法摆脱这种感觉,即必须有一种更好/更简单的方法来做您真正打算做的任何事情!solvesetSolutionStateuseState
0赞 713sean 1/10/2023
罗宾,这个细节已经包含在我的代码中,请重新阅读
0赞 Robin Zigmond 1/10/2023
与这里的许多人相比,我很感激你的问题写得很好,谢谢你。但是,我无法真正以目前的形式回答它。我不知道你在这里实际在做什么样的计算,它们需要什么,以及这与你的组件的 UI 应该如何表现有什么关系。在不知道这一点的情况下,我发现不可能建议你应该做什么。

答: 暂无答案