React JS 异步重计算

React JS asynchronous heavy calculations

我正在尝试在 JavaScript 中进行一些繁重的计算。我目前正在使用 React 和 Redux。

使用某些库(如 fetch 或 jQuery ajax 请求进行提取或服务器请求是 工作 预期的异步,但是我无法进行异步计算在客户端使用我自己的 JavaScript 函数。

像这样使用 setTimeout 在 React 组件 componentDidMount 函数中执行此操作会阻塞我的 UI:

componentDidMount () {
   setTimeout(function() {
      ... do heavy calculations
   }, 0)
}

或在这样的调度操作中(我正在使用 redux-thunk):

heavyCalculationsAction: () => {
   return dispatch => {
      return new Promise(function (resolve, reject) {
        setTimeout(function () {
           ... perform heavy calculations here
           resolve(data)
        }, 0)
      }).then((data) => {
          distpatch(computationsDone(data))
      })
   }
}

在这两种情况下,UI 都会冻结,直到计算完成。

也许我应该通过网络工作者或其他方式来解决这个问题,因为我无法让 setTimeout 释放我的 UI 线程。

Javascript是单线程的,一般在UI线程中有运行s。 setTimeout 不会 运行 在后台线程中编写代码,因此任何 运行 都会阻塞您的 UI。

要完成大量工作,您需要使用网络工作者(运行 在单独的非 UI 线程中),或者您需要将工作分解成更小的块,并且通过使用 setTimeout 或 requestIdleCallback 来安排每个块,一次只做一点点。