[]
AsyncFunction 및 AsyncEvaluateContext 클래스를 사용하여 서버 측에서 함수를 평가할 수 있습니다. AsyncFunctionEvaluateMode 클래스를 사용하여 함수가 어떻게 평가될지 지정할 수 있습니다.
다음 코드 샘플은 AsyncFunction 클래스를 확장한 사용자 정의 함수를 정의하고, 타임아웃을 통해 서버 측 평가를 시뮬레이션합니다.
var asum = function () {}
// "ASUM" 클래스를 정의하고 AsyncFunction을 확장
asum.prototype = new GC.Spread.CalcEngine.Functions.AsyncFunction("ASUM", 1, 255);
// 기본값을 "Loading..."으로 설정
asum.prototype.defaultValue = function () { return "Loading..."; };
// evaluateAsync 함수 오버라이드
asum.prototype.evaluateAsync = function (context) {
var args = arguments;
// 서버 측 평가를 시뮬레이션하기 위한 타임아웃 또는 Ajax POST 사용
setTimeout(function () {
// 평가 로직
var result = 0;
for (var i = 0; i < args.length; i++) {
result += args[i];
}
result *= 2;
// CalcEngine에 비동기 결과 설정
context.setAsyncResult(result);
}, 2000);
}
// 또는 Ajax POST 방식 사용
/$.ajax({
//url: '@Url.Action("ASUM", "Home")',
//type: "POST",
//data: JSON.stringify(args),
//contentType: "application/json,charset=UTF-8",
//success: function (data) {
//context.SetAsyncResult(data.result);
//}
//});
// ASUM 함수를 spread에 추가하고 수식 설정
activeSheet.addCustomFunction(new asum());
activeSheet.setValue(0, 0, 5);
activeSheet.setValue(0, 1, 15);
activeSheet.setFormula(1, 1, "ASUM(A1,B1)");
다음 코드 샘플은 Refresh
수식을 사용하여 수식을 다시 계산하는 방법을 보여줍니다:
window.onload = function(){
var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"),{sheetCount:3});
var sheet = spread.getActiveSheet();
var GetNumberFromServer = function () {
}
GetNumberFromServer.prototype = new GC.Spread.CalcEngine.Functions.AsyncFunction("GETNUMBERFROMSERVER", 2, 2);
GetNumberFromServer.prototype.evaluate = function (context, arg1, arg2) {
var self = this;
$.get('http://xa-tools-shdev/asyncfunction/api/values/' + (arg1 || 1), function (value) {
context.setAsyncResult(value);
});
}
GC.Spread.CalcEngine.Functions.defineGlobalCustomFunction("GETNUMBERFROMSERVER", new GetNumberFromServer());
sheet.setValue(0, 0, 'ChangeValue');
sheet.setValue(0, 1, 'Formula');
sheet.setValue(0, 2, 'Result');
sheet.setValue(0, 3, 'Comments');
sheet.setValue(1, 3, 'On A2 changed');
sheet.setValue(2, 3, 'On A2 changed');
sheet.setValue(3, 3, 'Evaluate once');
sheet.setValue(4, 3, 'Every 2 seconds');
sheet.setValue(1, 0, 1);
sheet.setValue(1, 1, '=GetNumberFromServer(A2)');
sheet.setValue(2, 1, '=Refresh(GetNumberFromServer(A2), 0)');
sheet.setValue(3, 1, '=Refresh(GetNumberFromServer(A2), 1)');
sheet.setValue(4, 1, '=Refresh(GetNumberFromServer(A2), 2, 2000)');
sheet.setFormula(1, 2, '=GetNumberFromServer(A2)');
sheet.setFormula(2, 2, '=Refresh(GetNumberFromServer(A2), 0)');
sheet.setFormula(3, 2, '=Refresh(GetNumberFromServer(A2), 1)');
sheet.setFormula(4, 2, '=Refresh(GetNumberFromServer(A2), 2, 2000)');
sheet.setColumnWidth(0, 100);
sheet.setColumnWidth(1, 300);
sheet.setColumnWidth(2, 200);
sheet.setColumnWidth(3, 200);
sheet.setValue(7, 1, "=Refresh(now(), 2, 1000)");
sheet.setValue(7, 3, "Every 1 seconds");
sheet.setFormula(7, 2, "=Refresh(now(), 2, 1000)");
var GetTimeFromServer = function () {
}
GetTimeFromServer.prototype = new GC.Spread.CalcEngine.Functions.AsyncFunction("GETTIMEFROMSERVER", 2, 2);
GetTimeFromServer.prototype.evaluate = function (context) {
$.get('http://xa-tools-shdev/asyncfunction/api/time/', function (value) {
context.setAsyncResult(value);
});
}
GetTimeFromServer.prototype.evaluateMode = function () {
return 2;
};
GetTimeFromServer.prototype.interval = function () {
return 1000;
};
GC.Spread.CalcEngine.Functions.defineGlobalCustomFunction("GETTIMEFROMSERVER", new GetTimeFromServer());
sheet.setValue(10, 1, "=GetTimeFromServer()");
sheet.setValue(10, 3, "Every 1 seconds");
sheet.setFormula(10, 2, "=GetTimeFromServer()");
sheet.getCell(10, 2).hAlign(GC.Spread.Sheets.HorizontalAlign.right);
}