找回密码
 立即注册

QQ登录

只需一步,快速开始

白鱼

中级会员

61

主题

227

帖子

586

积分

中级会员

积分
586
白鱼
中级会员   /  发表于:2024-4-18 18:43  /   查看:2546  /  回复:9
1金币
我设置了一个自定义异步函数,但是发现当设置计算模式为GC.Spread.CalcEngine.Functions.AsyncFunctionEvaluateMode.onRecalculation模式时,每次resumePaint都会重新计算一次?为什么不是在引用的单元格变化时才变化呢?这样一来这个函数过多时会造成计算卡顿,有什么方法可以关掉非必要的异步函数计算吗?

详情看附件,将src压缩文件解压后运行

demo.zip

4.12 MB, 下载次数: 1051

最佳答案

查看完整内容

对于您的第一个问题,主要原因并不在resumePaint方法,而在您的resumeCalcService方法,该方法如果不传入参数,那么默认是会计算所有公式的,因此您只要给这个公式传入false,就不会出现所有异步公式都计算一次了

9 个回复

倒序浏览
最佳答案
最佳答案
Richard.HuangSpreadJS 开发认证
超级版主   /  发表于:2024-4-18 18:43:49
来自 8#
白鱼 发表于 2024-4-19 17:42
第一个问题我的意思是每次resumePaint都会重新渲染所有异步公式,但是实际上其它的单元格并没有变化,不 ...

对于您的第一个问题,主要原因并不在resumePaint方法,而在您的resumeCalcService方法,该方法如果不传入参数,那么默认是会计算所有公式的,因此您只要给这个公式传入false,就不会出现所有异步公式都计算一次了
image.png964893188.png
回复 使用道具 举报
白鱼
中级会员   /  发表于:2024-4-19 09:14:33
2#
image.png735369567.png
而且有个问题,如图所示,我按顺序设置了这三个单元格,但是当代码里面自动重置第一个单元格公式然后触发resumePaint时,前两个单元格会陷入#value的状态,只有最后一个单元格能正常显示
回复 使用道具 举报
Richard.HuangSpreadJS 开发认证
超级版主   /  发表于:2024-4-19 17:33:15
3#
您好,对于您的第一个问题,为什么您要不停的去设置一个公式,每次设置新的公式进去,就需要计算一次。
image.png699084472.png

对于您的第二个问题,因为您没有对自定义的异步函数进行自定义序列化的操作,我们不能简单的导入就能计算,您可以参考您的另一篇帖子中的回复:https://gcdn.grapecity.com.cn/fo ... read&tid=217453
回复 使用道具 举报
不吐葡萄皮
注册会员   /  发表于:2024-4-19 17:34:55
4#
看了一下,楼主可以试试:
1. evaluateAsync 里面不能直接开始context.setAsyncResult('starting'), 需要setTimeout包一下setTimeout(() => {
      context.setAsyncResult('starting')
    })
2. 推荐楼主升到最新版本
3. AsyncFunctionEvaluateMode为默认值试试,我这边一直可以引用单元格变化了异步函数就重算了

评分

参与人数 1金币 +300 收起 理由
Richard.Huang + 300 很给力!

查看全部评分

回复 使用道具 举报
白鱼
中级会员   /  发表于:2024-4-19 17:42:39
5#
Richard.Huang 发表于 2024-4-19 17:33
您好,对于您的第一个问题,为什么您要不停的去设置一个公式,每次设置新的公式进去,就需要计算一次。

...

第一个问题我的意思是每次resumePaint都会重新渲染所有异步公式,但是实际上其它的单元格并没有变化,不需要异步渲染。当我对大量单元格设置异步公式时,每一次resumePaint都会触发所有异步公式计算,这个计算量会比较大。
第二个问题可能是我没说清楚,我这边已经排查到,如果是同步设置结果,就会先展示成#VALUE的形式,即结果必须异步设置才行。这一点排查很久才发现,希望可以说明一下。
回复 使用道具 举报
白鱼
中级会员   /  发表于:2024-4-19 17:45:29
6#
不吐葡萄皮 发表于 2024-4-19 17:34
看了一下,楼主可以试试:
1. evaluateAsync 里面不能直接开始context.setAsyncResult('starting'), 需要s ...

是的,这个问题我发现了,异步函数必须要异步设置结果才能正常显示,如果里面的数据直接同步设置时就会展示成#VLAUE。感谢回复
回复 使用道具 举报
Richard.HuangSpreadJS 开发认证
超级版主   /  发表于:2024-4-22 12:13:10
7#
不吐葡萄皮 发表于 2024-4-19 17:34
看了一下,楼主可以试试:
1. evaluateAsync 里面不能直接开始context.setAsyncResult('starting'), 需要s ...

回复 使用道具 举报
白鱼
中级会员   /  发表于:2024-4-22 14:21:45
9#
Richard.Huang 发表于 2024-4-22 12:30
对于您的第一个问题,主要原因并不在resumePaint方法,而在您的resumeCalcService方法,该方法如果不传入 ...

好的,明白了,感谢感谢
回复 使用道具 举报
Richard.HuangSpreadJS 开发认证
超级版主   /  发表于:2024-4-22 14:34:22
10#
白鱼 发表于 2024-4-22 14:21
好的,明白了,感谢感谢

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部