请选择 进入手机版 | 继续访问电脑版
首页
开发者学堂
文档
论坛
市场
生态机会
活动

HH123
注册会员   /  发表于:2025-7-25 13:46  /   查看:593  /  回复:6
10金币
本帖最后由 Joestar.Xu 于 2025-7-25 15:15 编辑


sheetObj.recalcAll(true); ////手动执行所有公式计算
////打算公式都运算完后再继续执行下面这个代码
var a = 1;

请问
在执行recalcAll函数计算所有公式时,是不是会等到所有Sheet页的公式都计算完了后才会执行其后续代码,比如 a=1,还是不会等到所有公式都运算完就继续执行a=1代码了?

最佳答案

查看完整内容

自定义的异步公式的计算在最终计算出结果之后,会调用一个setAsyncResult函数,您可以在所有异步函数的setAsyncResult都被调用之后,再执行您自己的逻辑,这要求您自己管理这些异步公式。 这边通过一个简单的计数器实现了对异步公式的管理,您可以用类似的思路试试:

6 个回复

最佳答案
最佳答案
Matthew.Xue
超级版主   /  发表于:2025-7-25 13:46:02 来自 5#
HH123 发表于 2025-7-25 16:36
那如果是异步自定义公式的话,有什么方式能够跟踪确定这个异步公式就是执行了吗,并且执行完了,因为我们遇 ...

自定义的异步公式的计算在最终计算出结果之后,会调用一个setAsyncResult函数,您可以在所有异步函数的setAsyncResult都被调用之后,再执行您自己的逻辑,这要求您自己管理这些异步公式。
这边通过一个简单的计数器实现了对异步公式的管理,您可以用类似的思路试试:
  1. let asyncFuncCount = 0
  2. function doRecalcAll() {
  3.     asyncFuncCount = 0
  4.     sheet.recalcAll()
  5. }

  6. function reduceIt() {
  7.     asyncFuncCount--
  8.     if(asyncFuncCount==0) {
  9.         console.log("异步计算完成")
  10.     }
  11. }
  12. customAsyncFunction.prototype.evaluateAsync = function(context) {
  13.     asyncFuncCount++
  14.     setTimeout(() => {
  15.         context.setAsyncResult("result")
  16.         reduceIt()
  17.     }, 1000);
  18. }
  19. doRecalcAll()
复制代码


回复 使用道具 举报
Matthew.Xue
超级版主   /  发表于:2025-7-25 16:24:41 2#
您好,除了您自己定义的异步公式之外,SpreadJS会在所有公式都计算完成之后,再执行下一行代码,它是一个同步的方法。
请问您目前是遇到什么问题了吗?
回复 使用道具 举报
HH123
注册会员   /  发表于:2025-7-25 16:36:47 3#
那如果是异步自定义公式的话,有什么方式能够跟踪确定这个异步公式就是执行了吗,并且执行完了,因为我们遇到了自己写的自定义公式有时没有触发。
在打开sheet时有执行recalcAll函数,sheet中有好多自定义公式,且都是异步执行的,但是发现了有些没有执行,以为单元格值没变化
回复 使用道具 举报
HH123
注册会员   /  发表于:2025-7-25 16:47:47 4#
我在咱们论坛里面有找到自定义公式定义时也定义了evaluateMode为onRecalculation,但是我们没有,这个有影响吗,evaluatemode默认值是不是就是onRecalculation
回复 使用道具 举报
HH123
注册会员   /  发表于:2025-7-25 17:36:12 6#
回复 使用道具 举报
Matthew.Xue
超级版主   /  发表于:2025-7-25 17:55:07 7#

那这边就先结贴了,有其他问题欢迎发新帖
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部
求助中心
快速入口