找回密码
 立即注册

QQ登录

只需一步,快速开始

palan_qu

金牌服务用户

21

主题

60

帖子

243

积分

金牌服务用户

积分
243
palan_qu
金牌服务用户   /  发表于:2021-3-31 11:48  /   查看:3610  /  回复:9
当表格中存在循环引用,同时自定义异步公式中直接调用setAsyncResult时, image.png407716063.png
会出现如下错误
image.png689597778.png
但去掉循环引用或者自定义异步公式中异步调用setAsyncResult时,不会出错
image.png623221129.png

component.ts

1.92 KB, 下载次数: 318

9 个回复

倒序浏览
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-3-31 11:55:34
沙发
您好,为了更快的解决您的问题,建议您上传一份完整可运行的demo,并详细的描述复现此问题的步骤
回复 使用道具 举报
palan_qu
金牌服务用户   /  发表于:2021-3-31 20:05:12
板凳
lynn512 发表于 2021-3-31 11:55
您好,为了更快的解决您的问题,建议您上传一份完整可运行的demo,并详细的描述复现此问题的步骤

写个完整能运行的demo有点麻烦,我描述下复现步骤.
1. 一个带循环引用的excel,并打开循环引用计算
2. 实现一个异步函数,重写evaluateAsync方法,方法中就一行代码context.setAsyncResult(1)
3. 在workbook中注册该异步函数,在单元格中使用该函数
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-4-1 09:00:15
地板
收到,这边先根据您的描述写个demo,待问题复现了会在本贴回复您。
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-4-1 12:29:25
5#
问题已复现,
”但去掉循环引用或者自定义异步公式中异步调用setAsyncResult时,不会出错“
请问您说的 去掉循环引用 指的是什么操作呢?
是设置  spread.options.iterativeCalculation = false 吗?
回复 使用道具 举报
palan_qu
金牌服务用户   /  发表于:2021-4-1 14:32:15
6#
lynn512 发表于 2021-4-1 12:29
问题已复现,
”但去掉循环引用或者自定义异步公式中异步调用setAsyncResult时,不会出错“
请问您说的 去 ...

不是,是指表格中不存在循环引用的单元格
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-4-1 14:36:58
7#
本帖最后由 lynn512 于 2021-4-6 15:34 编辑

好的,情况以了解,这边已将此问题记录下来,待有进展会在本贴更新。(SJS-8232)
本贴先做保留处理。
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-4-12 15:29:13
8#
您好,附件demo1复现了您的问题,
原因说明:
直接在evaluateAsync 调用setAsyncResult。
(setAsyncResult将直接调用recalculate 并清除calcChain。
但是setFormula也将调用recalculate, 导致报错:" Cannot read property '0' of undefined")


现解决方案如下
  1. var asum = function () {};
  2.         asum.prototype = new GC.Spread.CalcEngine.Functions.AsyncFunction('ASUM', 1, 255);
  3.         asum.prototype.defaultValue = function () { return 'Loading...'; };
  4.         asum.prototype.evaluateAsync = function (context, arg) {
  5.             context.setAsyncResult(1);
  6.         };
  7.         sheet.addCustomFunction(new asum());
复制代码
将以上代码修改如下:
  1. var asum = function () {};
  2.         asum.prototype = new GC.Spread.CalcEngine.Functions.AsyncFunction('ASUM', 1, 255);
  3.         asum.prototype.defaultValue = function () { return 'Loading...'; };
  4.         asum.prototype.evaluateAsync = function (context, arg) {
  5.             setTimeout(()=>{context.setAsyncResult(1);});
  6.         };
  7.         sheet.addCustomFunction(new asum());
复制代码

请参考附件的demo尝试解决您的问题。





demo.zip

10.49 KB, 下载次数: 292

回复 使用道具 举报
palan_qu
金牌服务用户   /  发表于:2021-4-12 19:18:00
9#
lynn512 发表于 2021-4-12 15:29
您好,附件demo1复现了您的问题,
原因说明:
直接在evaluateAsync 调用setAsyncResult。

ok了解了
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-4-13 09:12:56
10#
您客气了,把本帖就先结帖了,有问题欢迎另开新帖。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部