找回密码
 立即注册

QQ登录

只需一步,快速开始

Universail
金牌服务用户   /  发表于:2023-11-10 15:37  /   查看:2728  /  回复:11
本帖最后由 Richard.Huang 于 2023-11-15 10:00 编辑

产品:SpreadJS
版本:V16.2.5


单元各种写了大量(200+)自定义公式,自定义会向后端发起请求获取数值,所以是异步的。
我希望所有的公式执行完成以后,再去重新渲染界面,参考官网案例,代码是这样写的:
  1. console.time("FFF");
  2. workBook!.suspendPaint();
  3. workBook!.suspendCalcService();
  4. console.time("KKK");
  5. workBook.calculate();
  6. console.timeEnd("KKK");
  7. workBook!.resumeCalcService();
  8. workBook!.resumePaint();
  9. console.timeEnd("FFF");
复制代码

测试发现,公式请求后端没有返回之前,上述代码已经先执行完了。

该怎么来实现我的需求?



image.png981781921.png

11 个回复

倒序浏览
Universail
金牌服务用户   /  发表于:2023-11-10 15:40:32
沙发
PS: 如果初次打开的时候,怎么判断所有的公式都已经完成了计算?有没有相关事件或者注册回调的api?
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-11-10 17:42:03
板凳
本帖最后由 Ellia.Duan 于 2023-11-10 17:43 编辑

您好,我猜测您的步骤是下述步骤

第一步fromJSON导入数据,
第二步后端请求进行异步加载,
第三步公式计算 workBook.calculate()。
所以您是在第二步未执行完成就执行了第三步?
如果您的步骤不是这样子的,建议您重新描述下您的步骤。或者简单录个动图描述一下。
回复 使用道具 举报
Universail
金牌服务用户   /  发表于:2023-11-10 21:21:45
地板
Ellia.Duan 发表于 2023-11-10 17:42
您好,我猜测您的步骤是下述步骤

第一步fromJSON导入数据,

不是,我就是有个按钮,点击之后,执行如下方法:

  1. async function Viewer_Recalculate() {
  2.      const inst = instance[activeCode.value];
  3.      const workBook = inst.Viewer.designer?.getWorkbook() as GC.Spread.Sheets.Workbook;
  4.      const sheet = workBook?.getActiveSheet();
  5.      workBook!.suspendCalcService();
  6.      workBook!.suspendPaint();
  7.      workBook.calculate();
  8.      workBook!.resumeCalcService();
  9.      workBook!.resumePaint();
  10.     }
复制代码


image.png666122741.png
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-11-13 10:27:45
5#
您好,公式请求后端的相关API可以发下吗?
按照您的描述,”公式请求后端没有返回之前,上述代码已经先执行完了。“对于这句话不是很明白,请求后端异步函数,执行后,开始执行上述代码。您的异步函数有问题吗?
回复 使用道具 举报
Universail
金牌服务用户   /  发表于:2023-11-13 17:50:24
6#
Ellia.Duan 发表于 2023-11-13 10:27
您好,公式请求后端的相关API可以发下吗?
按照您的描述,”公式请求后端没有返回之前,上述代码已经先执 ...

后端请求的api是内部的接口,发给你也无法使用。
我现在的问题核心就是:单元格中写了几百个异步公式,导致需要像后端发送大量请求,这种场景,有没有好的处理方案?
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-11-13 18:01:48
7#
您好,我们将深入调研下您的问题。待有进展会及时联系您。
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-11-14 11:15:22
8#
本帖最后由 Ellia.Duan 于 2023-11-14 11:17 编辑

您好,想问下您,为什么异步公式结束后,需要执行  workBook.calculate(); 通过您的描述,您在异步公式中,调用后端请求,返回计算结果。
既然,计算结果已经返回,为什么需要重新计算呢( workBook.calculate())?
回复 使用道具 举报
WilliamChang
葡萄城公司职员   /  发表于:2023-11-14 11:35:16
9#
本帖最后由 WilliamChang 于 2023-11-14 11:37 编辑

你好,参考如下代码看看能不能解决问题,添加asyncCount计数器,计数器为0时spread.resumePaint();

  1.     var asyncSum = function () {
  2.     };
  3.     asyncSum.prototype = new GC.Spread.CalcEngine.Functions.AsyncFunction("ASUM", 1, 255);
  4.     asyncSum.prototype.defaultValue = function () {
  5.         return "Loading...";
  6.     };
  7.     asyncSum.prototype.evaluateAsync = function (context) {
  8.         // use setTimeout to simulate server side evaluation
  9.         // in read world it maybe an ajax post to server for evaluation
  10.         var args = arguments;
  11.         window.asyncCount = (window.asyncCount || 0) + 1;
  12.         setTimeout(function () {
  13.             var result = 0;
  14.             for (var i = 1; i < args.length; i++) {
  15.                 result += args[i];
  16.             }
  17.             result *= 2;
  18.             context.setAsyncResult(result);
  19.             window.asyncCount--;
  20.             if (window.asyncCount <= 0) {
  21.                 setTimeout(function () {
  22.                     spread.resumePaint();
  23.                 });
  24.             }
  25.         }, 2000);
  26.     };

  27. spread.addCustomFunction(new asyncSum());

  28. spread.suspendCalcService();
  29. spread.suspendPaint();
  30. spread.getActiveSheet().setFormula(0,0,"ASUM(2,3,4)");
  31. spread.getActiveSheet().setFormula(1,0,"ASUM(2,3,4)");
  32. spread.getActiveSheet().setFormula(2,0,"ASUM(2,3,4)");
  33. spread.getActiveSheet().setFormula(3,0,"ASUM(2,3,4)");
  34. spread.getActiveSheet().setFormula(4,0,"ASUM(2,3,4)");
  35. spread.calculate();
  36. spread.resumeCalcService();
复制代码
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-11-14 12:16:54
10#
您好,可以参考楼上回复,看是否可以解决您的问题?
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部