请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

manabout13

注册会员

12

主题

34

帖子

116

积分

注册会员

积分
116
manabout13
注册会员   /  发表于:2025-11-17 09:52  /   查看:98  /  回复:4
1金币
想要在SpreadJs打开后,等待所有公式计算完成后再保存(我们自定义了大量的公式,都是异步从数据库中获取数据,时间比较长),需要校验公式是否已经计算完成,是否存在计算错误#value的公式。

验证公式是否计算完成这个没有思路,是否由相关的判断?

最佳答案

查看完整内容

Excel不支持异步函数,所以不会面临您说的这种情况,所有计算都是同步的,在计算的过程中,ui其实是无响应的,SpreadJS也是一样。 只有异步计算才会有计算中的状态,而这个状态是用户自行控制的,整个计算过程中,也不是一定要占用线程,也就是说用户有可能是可以操作的,比方说异步计算的时候调用了接口,接口花费了很长时间才返回,在这个时间里,用户是可以操作的。 Excel中计算的触发是通过单元格值的变动进行的。 您说的 ...

4 个回复

最佳答案
最佳答案
Matthew.Xue
超级版主   /  发表于:2025-11-17 09:52:46
来自 5#
manabout13 发表于 2025-11-18 09:32
Excel是用户自定义的一个模板,其中的公式可能会非常复杂,夹杂着Excel和自定义异步公式的混合嵌套的调用。 ...

Excel不支持异步函数,所以不会面临您说的这种情况,所有计算都是同步的,在计算的过程中,ui其实是无响应的,SpreadJS也是一样。
只有异步计算才会有计算中的状态,而这个状态是用户自行控制的,整个计算过程中,也不是一定要占用线程,也就是说用户有可能是可以操作的,比方说异步计算的时候调用了接口,接口花费了很长时间才返回,在这个时间里,用户是可以操作的。
Excel中计算的触发是通过单元格值的变动进行的。
您说的公式很长,其实跟这个也没有关系,只要您在每一个异步公式中都添加计数的逻辑,就能很轻松地判断当前的计算是否完成了,不必关心用户到底写了多复杂的公式。计数逻辑也很简单,设定一个全局的count变量,在异步函数evaluateAsync的第一行将count加一,在setAsyncResult之前将count减一即可。判断计算是否完成,只需要判断count是否等于零。
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2025-11-17 11:35:48
2#
您好,目前官方API中没有相关的接口可以支持判断是否全部计算完毕,您可以在异步函数中使用诸如计数器等判断方式来进行判断。
回复 使用道具 举报
Matthew.Xue
超级版主   /  发表于:2025-11-17 11:39:58
3#
您好,ai回复的基本是正确的,因为自定义异步函数在调用evaluateAsync后,还需要在异步计算完成后调用setAsyncResult方法来设置计算的结果,所以您可以在通过自行维护的方式来统计计算是否完成。
回复 使用道具 举报
manabout13
注册会员   /  发表于:2025-11-18 09:32:06
4#
本帖最后由 manabout13 于 2025-11-18 09:34 编辑

Excel是用户自定义的一个模板,其中的公式可能会非常复杂,夹杂着Excel和自定义异步公式的混合嵌套的调用。最复杂的单元格的公式长度甚至能达到500个字符,包含几十个公式组成。因为有IF的嵌套,使用计数器来跟踪确实有点无从下手。
还有更好的办法吗?是否有当前单元格的状态呢?类似于已经计算完成(包括Excel的公式和自定义的公式),正在计算中,等待计算这样的状态?
我的理解是Excel内部应该有维护类似状态的变量才对,要不怎么去触发计算呢?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部