背景

60年代时,操作系统中独立运行的单元通常是进程。但随着计算机技术的发展,人们发现在进程运行过程中,创建、撤销与切换都要花费较大的时空开销。

到了80年代为了解决这一问题,出现了更小的独立运行基本单位——线程。

操作系统把 CPU 处理时间划分成许多更小的时间片,在每一个独立时间片执行一个线程的指令,到下一个时间片继续执行下一线程的指令,各线程轮流执行,由于每一个时间片时间都比较短,所有线程都会运行,对于使用者而言就好像所有线程在同时进行。最终达到的效果就是在编程时可以创建多个线程,同一时间运行,各线程可以"并行"运行,以完成不同的任务。

这时新的问题也出现了,在单独线程的运行模式之下,一段代码调用另一段代码时,只能采用同步调用,只有当前代码执行完成返回结果之后,调用才能继续往下执行。用一个例子就是现在只有一个水槽,一匹马想喝水只能等上一匹马走了才能继续喝。

而有了多线程的支持,可以采用异步函数的调用,这个问题就迎刃而解了。

异步函数原理介绍

程序中会有很多内容,计算内容复杂、渲染内容繁多,在处理过程中需要花费比较多的时间。当某个模块A调用了模块B的处理内容时,这时模块B中的内容就需要一些时间处理,此时模块A如果不停地等待,就会严重影响程序性能。在实际情况中,就比如在前端页面中需要进行在线填报的数据处理,需要对数据内容进行计算后放入表格中展示,这是由于计算并未完成,页面内容也不显示,给用户带来的感觉就是内容都点击运行了,但是页面迟迟没有任何反馈。

出现了异步函数的调用之后,此时执行的模块A和模块B分别属于不同的线程。

在异步调用中,模块A不需要等到模块B返回内容,就可以继续执行后续代码。

模块B中的内容执行完毕后,会通知模块A:我这边处理完毕,你记得处理后续内容。

借助异步调用,可以把刚刚我们提到的前端页面中显示问题进行优化:把整个初始化处理放进一个单独线程,主线程启动此线程后接着往下走,让主窗口瞬间显示出来。等思索需要进行的操作的内容时,数据计算处理就已经在暗中处理完毕;程序开始稳定运行以后,异步调用还可以进一步优化人机交互的过程。用户点击鼠标时进行操作的时候,操作内容比较费时,点击后系统没有立马作出回应,这会让用户的使用体验很糟糕。将更费时、速度更慢的操作内容转为异步调用,让主线程随时恭候下一条消息,这样用户的鼠标操作动作响应速度更快,使用体验自然大大提升。

实践:专家用户的花式使用

实例演示

我们用一个简单的例子,看看在前端电子表格单元格计算中,如何使用异步函数。

var ServerDecode = function () {};
ServerDecode.prototype = new GC.Spread.CalcEngine.Functions.AsyncFunction("DECODE", 1, 255);
ServerDecode.prototype.evaluateAsync = function (context, arg1) {
$.get("decode/" + arg1, function (data, status) {
context.setAsyncResult(data);
});
}; spread.addCustomFunction(new ServerDecode()); sheet.setFormula(0, 1, '=DECODE(A1)');

在这个算法中我们将设定的计算解析方法部分放在服务器上,方法名称叫DECODE

下一步将参数用jquery.get请求发送到服务器中,然后获取请求内容后完成设置

然后将整个异步函数注册进入Spread中

最后在B1单元格中,输入DECODE(A1)

这样当A1单元格内容发生变化的时候,B1就会根据我们设定的计算规则重算成对应内容

异步函数的花式使用

工具总在不同人手中被挖掘出各种各样的用法,而在去年冬天我们就收到了用户反馈的异步函数的各种奇妙使用方式。

他们使用异步函数的参数组合成了一个SQL,发送给数据库进行数据查询,并在查询结束后显示查询结果。结果一切正确,但是却出现了一个小问题。

在使用过程中,用户发现查询在整个过程中超过了 四次 ,询问我们是否是公式出错?

我们当即开展问题排查,在查看源代码的过程中我们发现,在最早实现这个功能的时候为了强调数据重要性,当同一个公式中出现多个异步函数调用时,再次计算下一个内容时我们还会再计算一次已经计算过的异步函数的内容。

没想到用户确实会这样使用异步函数,这一部分内容随后也进行整体调整。现已调整为每次调用只计算一次异步函数。

有了这次经历,再遇到用户对异步函数的其他花里胡哨的用法,我们就见怪不怪了。

果不其然,没多久又收到了其他用户的花式使用反馈。

这一次用户使用异步函数从服务器获取当前服务名,并在SpreadJS显示出来。

我们发现这个用户还在其中添加了格式字符串,用以获取用户的二维码。同时在这里还设置了条件格式,如果用户没有登录会有报错提示。

这个例子内容虽短,但在这里用户将异步函数、条件、格式还有格式字符串三个功能都结合在一起使用。

总结

以上就是我们全部对异步函数诞生背景和原理,以及在前端电子表格中异步函数的使用和各种神仙用户的花式使用,到本节关于电子表格计算原理的全部内容就已经介绍完毕。

觉得内容不错点个赞再走吧~

新技能GET!在前端表格中花式使用异步函数的奥义的更多相关文章

  1. 更优雅的方式: JavaScript 中顺序执行异步函数

    火于异步 1995年,当时最流行的浏览器--网景中开始运行 JavaScript (最初称为 LiveScript). 1996年,微软发布了 JScript 兼容 JavaScript.随着网景.微 ...

  2. map中使用await 异步函数

    let result=await Promise.all(dataComments.map(async (ele)=>{ return (async ()=>{ let resData= ...

  3. js类的constructor中不支持异步函数吗?

    解决方案: 1.如果是普通函数,可以用async 和await来解决你的问题但你这个是在constructor里,constructor 的作用是返回一个对像实例,如果加了async就变成返回一个pr ...

  4. js的for循环中出现异步函数,回调引用的循环值总是最后一步的值?

    这几天跟着视频学习node.js,碰到很多的异步函数的问题,现在将for循环中出现的异步函数回调值的问题总结如下: 具体问题是关于遍历文件夹中的子文件夹的,for循环包裹异步函数的代码: for (v ...

  5. 【新功能前瞻】SpreadJS 纯前端表格控件V12.2:打印增强、拖拽填充等六大特性

    新版本来袭:葡萄城 SpreadJS 纯前端表格控件的全新版本 V12.2 将于8月正式发布! 作为一款备受华为.招商银行.中国平安.苏宁易购等行业专家和前端开发者认可的纯 JavaScript 电子 ...

  6. 在Vue前端界面中,几种数据表格的展示处理,以及表格编辑录入处理操作。

    在Vue前端项目中,我这里主要是基于Vue+Element的开发,大多数情况下,我们利用Element的表格组件就可以满足大多数情况的要求,本篇随笔针对表格的展示和编辑处理,综合性的介绍几款表格组件的 ...

  7. DHTMLX 前端框架 建立你的一个应用程序 教程(十一)--添加/删除表格中的记录

    添加/删除表格中的记录 我们的最终功能是在表格中添加删除 我们通过单机工具栏上的按钮来实现添加删除 当我们单击添加按钮的时候, 表单中 第一行默认填写New contact 光标自动聚焦 当用户点击删 ...

  8. 【案例分享】在 React 框架中使用 SpreadJS 纯前端表格控件

    [案例分享]在 React 框架中使用 SpreadJS 纯前端表格控件 本期葡萄城公开课,将由国电联合动力技术有限公司,资深前端开发工程师——李林慧女士,与大家在线分享“在 React 框架中使用 ...

  9. C# 在Word表格中插入新行(表格含合并行)

    public string CreateWordFile(string CheckedInfo)         {             string message = "" ...

随机推荐

  1. 深入浅出WPF-07.Property(属性)

    依赖属性 1)字段与属性:字段被封装在实例中,要么能够被外界访问(非Private),要么不能够被外界访问(Private).但是我们直接把数据暴露给外界的做法不安全,容易把错误的数据写入字段.于是我 ...

  2. 深入浅出WPF-01.WPF缘起

    WPF缘起 自2012年起,根据公司需要,开始进入界面开发工作.公司是医疗器械行业,很多操作都是基于PC进行的,所以桌面应用开发尤为重要.原有项目都是基于MFC进行的开发,而且是VC6.0的技术,维护 ...

  3. Erase-Remove 惯用法

    看到<Effective STL>条款 9 的时候想到了我以前复习的"如何正确使用迭代器删除元素",我面试时使用的也是里面的方法,看面试官的反应好像也没有什么问题,还问 ...

  4. Python代码阅读(第11篇):展开嵌套列表

    Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的代码实现了展开嵌套列表的功能,将一个嵌套的list展开成一个一维list(不改变原有列表的顺序). 本篇阅读的代 ...

  5. 当一个 Pod 被调度时,Kubernetes 内部发生了什么?

    在 Kubernetes 中,调度是指将 Pod 放置到合适的 Node 上,然后对应 Node 上的 Kubelet 才能够运行这些 Pod . kube-scheduler 是集群控制平面的主要组 ...

  6. 手机淘宝轻店业务 Serverless 研发模式升级实践

    一.前言 随着 Serverless 在业界各云平台落地,阿里内部 Serverless 研发平台.各种研发模式也在业务中逐步落地,如火如荼.在此契机下,淘系团队启动了轻店 Serverless 研发 ...

  7. 【原创】浅谈指针(五)const和指针

    前言 过了几个月再次更新.最近时间也不多了,快要期中考试了,暂且先少写一点吧. 本文仅在博客园发布,如在其他平台发现均为盗取,请自觉支持正版. 练习题 我们先来看几道题目.如果这几道题都不会的话,就先 ...

  8. (课内)信安数基RSA-level3-5

    emmmm感觉其实自己对这个的理解完全不够,原理只能写出这么个东西(悲) 代码完全是 攻击方式中(1)(2)内容的实现. lambda是一种可以理解为匿名函数的写法:写在这里看起来很酷炫(bushi) ...

  9. SLAM名词介绍

    gauge freedom:测量自由度 degrees-of-freedom(DoF) 自由度 wide-baseline matches:宽基线匹配 宽基线匹配:从描绘同一场景的两个或多个图像中建立 ...

  10. Microsoft Porject Online 学习随手记一:环境创建和数据导入

    没有想像的简单,也没那么复杂 Project OL之前是Dynamics 365 Enterprise P1中的一个模块,目前最新版本只能简单创建并且已经没有Enterprise P1选项. 主要流程 ...