- window.onload = function () {
- var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), {sheetCount: 2});
- initSpread(spread);
- };
- const reqMap = {}
- const pMap = {}
- function RegFn(key){
- return new Promise((resolve)=>{
- pMap[key] = {resolve}
- })
- }
- function Execute1(){
- for (let k in pMap){
- pMap[k].resolve(100)
- }
- }
- function initSpread(spread) {
- const asyncExe = function(){}
- asyncExe.prototype = new GC.Spread.CalcEngine.Functions.AsyncFunction("AEXE", 1, 1);
- asyncExe.prototype.defaultValue = function () {
- return 0
- };
- asyncExe.prototype.evaluateAsync =async function (context) {
- await Execute1()
- context.setAsyncResult("这个运算结果不是重点,只是为了触发函数");
- };
- var asyncSum = function () {
- };
- asyncSum.prototype = new GC.Spread.CalcEngine.Functions.AsyncFunction("ASUM", 1, 255);
- asyncSum.prototype.defaultValue = function () {
- return 0
- };
- asyncSum.prototype.evaluateAsync =async function (context) {
- // use setTimeout to simulate server side evaluation
- // in read world it maybe an ajax post to server for evaluation
- const key = `${context.id}-${context.row}-${context.col}`;
- alert('注册异步任务:'+context.id)//这里可以观察到单元格C2中第三个公式没有执行
- const res = await RegFn(key)
- context.setAsyncResult(res);
- alert("此时才返回结果")
- };
- var GetNumberFromServer = function () {
- };
- GetNumberFromServer.prototype = new GC.Spread.CalcEngine.Functions.AsyncFunction("GETNUMBERFROMSERVER", 1, 2);
- GetNumberFromServer.prototype.evaluate = function (context, arg1, arg2) {
- setTimeout(function () {
- var value = Math.random() + 1;
- context.setAsyncResult(value);
- }, 500);
- };
- GC.Spread.CalcEngine.Functions.defineGlobalCustomFunction("GETNUMBERFROMSERVER", new GetNumberFromServer());
- var GetTimeFromServer = function () {
- };
- GetTimeFromServer.prototype = new GC.Spread.CalcEngine.Functions.AsyncFunction("GETTIMEFROMSERVER");
- GetTimeFromServer.prototype.evaluate = function (context) {
- setTimeout(function () {
- var date = new Date();
- context.setAsyncResult(date);
- }, 500);
- };
- GetTimeFromServer.prototype.evaluateMode = function () {
- return 2;
- };
- GetTimeFromServer.prototype.interval = function () {
- return 1000;
- };
- GC.Spread.CalcEngine.Functions.defineGlobalCustomFunction("GETTIMEFROMSERVER", new GetTimeFromServer());
- var sheet = spread.sheets[0];
- sheet.suspendPaint();
- sheet.options.allowCellOverflow = true;
- sheet.setArray(0, 0, [[5, 15]]);
- sheet.addCustomFunction(new asyncSum());
- sheet.addCustomFunction(new asyncExe());
- sheet.setText(1, 1, 'ASUM(A1,B1)');
- sheet.setText(2, 1, 'SUM(A1,B1)');
- sheet.setFormula(1, 2, "ASUM(A1,B1)+ASUM(A1,B1)+ASUM(A1,B1)");
- sheet.getCell(1, 2).foreColor("green");
- sheet.setFormula(2, 2, "SUM(A1,B1)");
- sheet.setValue(4, 0, "Edit the formula of C2 or referenced cell' value to see how async function works.");
- sheet.setValue(8, 0, 'CHANGEVALUE');
- sheet.setValue(8, 1, 'FORMULA');
- sheet.setValue(8, 2, 'RESULT');
- sheet.setValue(8, 3, 'COMMENTS');
- sheet.setValue(9, 3, 'On A10 changed');
- sheet.setValue(10, 3, 'On A10 changed');
- sheet.setValue(11, 3, 'Evaluate once');
- sheet.setValue(12, 3, 'Every 2 seconds');
- sheet.setValue(9, 0, 1);
- sheet.setValue(9, 1, '=GetNumberFromServer(A10)');
- sheet.setValue(10, 1, '=Refresh(GetNumberFromServer(A10), 0)');
- sheet.setValue(11, 1, '=Refresh(GetNumberFromServer(A10), 1)');
- sheet.setValue(12, 1, '=Refresh(GetNumberFromServer(A10), 2, 2000)');
- sheet.setFormula(9, 2, '=GetNumberFromServer(A10)');
- sheet.setFormula(10, 2, '=Refresh(GetNumberFromServer(A10), 0)');
- sheet.setFormula(11, 2, '=Refresh(GetNumberFromServer(A10), 1)');
- sheet.setFormula(12, 2, '=Refresh(GetNumberFromServer(A10), 2, 2000)');
- sheet.getCell(12, 2).foreColor("green");
- sheet.setColumnWidth(0, 100);
- sheet.setColumnWidth(1, 300);
- sheet.setColumnWidth(2, 200);
- sheet.setColumnWidth(3, 200);
- sheet.setValue(15, 1, "=Refresh(now(), 2, 1000)");
- sheet.setValue(15, 3, "Every 1 second");
- sheet.setFormula(15, 2, "=Refresh(now(), 2, 1000)");
- sheet.getCell(15, 2).foreColor("green");
- sheet.setValue(18, 1, "=GetTimeFromServer()");
- sheet.setValue(18, 3, "Every 1 second");
- sheet.setFormula(18, 2, "=GetTimeFromServer()");
- sheet.getCell(18, 2).foreColor("green");
- sheet.getCell(18, 2).hAlign(GC.Spread.Sheets.HorizontalAlign.right);
- sheet.resumePaint();
- }
复制代码 |