首页 > 其他分享 >第三十六章 使用 CSP 进行基于标签的开发 - 使用尽可能少的#server和#call调用

第三十六章 使用 CSP 进行基于标签的开发 - 使用尽可能少的#server和#call调用

时间:2022-11-04 09:12:27浏览次数:91  
标签:workGet 调用 CSPPage server call 服务器 CSP

第三十六章 使用 CSP 进行基于标签的开发 - 使用尽可能少的#server和#call调用

#server#call的工作原理是,让浏览器向页面发出HTTP请求,其中包含一个特殊的加密令牌,该令牌告诉Caché要运行的方法名。
Caché运行这个方法,它发回的任何输出都在浏览器上以JavaScript的形式执行,此外,#server调用也可以返回一个值。
因为这些调用都使用HTTP请求,所以它们在网络数据包、服务器上的CPU等方面的开销与普通CSP页面请求大致相同。
如果使用大量的#server请求,那么它将极大地降低应用程序的可伸缩性,因为每个#server调用都要求从Caché服务器获得一个新的CSP页面。
这意味着,与传统的web页面(即您访问URL并生成一次页面)不同,一个包含10个服务器调用的CSP页面的成本与生成10CSP页面的成本相同;
如果可以减少#server调用的数量,那么可以将应用程序支持的用户数量增加10倍。

减少#server调用数量的方法是确保使用的每个#server调用都是应用程序真正需要的,如果是的话,则确保这个#server调用在服务器上做尽可能多的工作。
例如,下面是一个JavaScript块,它使用来自服务器的一些新值更新表单。

注意,这段代码使用CSP关键字CSPPage来引用页面本身,而不是Javascript关键字self
在本例中,这两个关键字的作用相同。
我们建议使用CSPPage,因为self可以在不同的上下文中意外地起作用。

<script language="JavaScript">
function UpdateForm()
{
   CSPPage.document.form.Name.value = #server(..workGet("Name",objid))#;
   CSPPage.document.form.Address.value = #server(..workGet("Address",objid))#;
   CSPPage.document.form.DOB.value = #server(..workGet("DOB",objid))#;
}
</script>

服务器代码如下所示。
(通常它会使用一个对象或SQL,但这里我们使用一个全局来保持代码小。)

<script language="Cache" method="workGet"
 arguments="type:%String,id:%String" returntype="%String">
   Quit $get(^work(id,type))
</script>

这一次更新从Caché服务器发出三次新网页调用!
这可以转换为一个#server调用,一次更新所有的值,JavaScript变成:

<script language="JavaScript">
function UpdateForm()
{
   #server(..workGet(objid))#;
}
</script>

方法定义为:

<script language="Cache" method="workGet"
 arguments="id:%String" returntype="%String">
   &js<CSPPage.document.form.Name.value = #($get(^work("Name",objid)))#;
      CSPPage.document.form.Address.value = #($get(^work("Address",objid)))#;
      CSPPage.document.form.DOB.value = #($get(^work("DOB",objid)))#;>
</script>

因此,只需传递一次数据,然后让Caché完成所有工作,而不是多次调用。
如果你有一个更复杂的JavaScript例子,比如:

<script language="JavaScript">
function UpdateForm()
{
   CSPPage.document.form.Name.value = #server(..workGet("Name",objid))#;
   if (condition) {
      CSPPage.document.form.DOB.value = #server(..workGet("DOB",objid))#;
   }
   else {
       CSPPage.document.form.DOB.value = '';
   }
}
</script>

那么这应该仍然只需要一个#server 调用。
你只需要将整个if条件嵌入到由#server调用返回的JavaScript中,所以代码workGet方法最终看起来像这样:

<script language="Cache" method="workGet"
 arguments="id:%String" returntype="%String">
   &js<CSPPage.document.form.Name.value = #(^work("Name",objid))#;
      if (condition) {
         CSPPage.document.form.DOB.value = #(^work("DOB",objid))#;
      }
      else {
         CSPPage.document.form.DOB.value = '';
      }
   >
</script>

#server#call创建自定义HyperEvent错误处理程序

如果您使用超事件(#server#call)调用某个东西,并且在执行时,它由于某种原因无法与服务器通信,然后生成一个错误,那么CSP的默认行为是在一个警告框中显示错误。
如果希望单独处理错误,比如记录它或向用户显示不同的消息,那么编写一个cspRunServerMethodError JavaScript函数。
下面的例子像默认行为一样在警告框中显示错误:

function cspRunServerMethodError(errortext,error)
{
   //alert('cspRunServerMethodError - cspHyperEventErrorHandler\n\nerrortext:' + errortext + '\n\nerror-object:\n' + JSON.stringify(error, null, 4) );
    
   if (error.code == '401') {
      document.location.href = '#(..Link(%request.URL))#'; //reloads the page
   }
   else {
      //...
   }

   return null;
  
}

cspHyperEventError对象类型具有以下属性和值:

  • code:对应于HTTP响应代码或来自正在使用的XMLHttpRequest对象的响应代码。
    XMLHttpRequest代码可能是特定于浏览器的。
  • text:一个空闲的文本字段,对应于返回给cspRunServerMethodError()回调函数的当前文本。
  • serverCode:对应于服务器上的错误编号(如果可用)。
    该值可以为空。
  • serverText:来自服务器的错误消息,如果可用的话。
    该值默认为空字符串,即" "
  • exception异常:触发错误的异常。
    该值可以为空。
  • arguments:捕获异常的函数的参数列表。
    此值可以为空,并且仅在定义了exception时才填充。

标签:workGet,调用,CSPPage,server,call,服务器,CSP
From: https://www.cnblogs.com/yaoxin521123/p/16856558.html

相关文章

  • 2022 CSP-S题解
    T1:假期计划给定\(n\)个点\(m\)条边的无向图,每个点有一个点权。在图中选\(4\)个不同的点,从\(1\)号点出发完成\(5\)段行程:\(1\toA\toB\toC\toD\to1\),每......
  • CSP 2022 游记
    CSP2022游记Day?:报初赛,考初赛,\(83\)分,过初赛。Day?:报复赛。Day-1:学校\(4:15\)放了学,回家吃了饭,坐动车去杭州。车上好无聊,刷了一车的B站。到杭州,乘......
  • 解决Server2012r2 服务器 中文乱码
    已解决,解决方法如下:我在输入chcp936时报错invalidpagecode,就按此处理,需要的人可自取现象:命令行中中文字符显示为问号,输入chcp936会提示invlalidpagecode.解决......
  • __stdcall 与 __cdecl 的含义
    1.作用:都是修饰函数2.含义:明确指出函数的参数在调用时以什么顺序压栈!3.范例:  右键打个断点、然后执行、进入反汇编: 7E7h指的就是2023字面量、h表示这是个......
  • CSP-S2022 游记
    久违的没有早读的周六,睡得还行。。上午就写了点可能会考到的板子。。赛时14:30-14:40感知了一下四道题目,还是决定顺着做14:40-16:20最开始T1读错题了,导致前面想的一......
  • 2022 CSP-S GX 迷惑行为大赏(P2 整活篇)
    总所周知,选手写了一些不妨碍代码本身但是又具有趣味性的文字/数字,会出现在注释中,最大最小值等处。让我们来看看GX的oier们都有哪些精彩的表现homo人homo人2.0homo全......
  • SqlServer 主从复制/读写分离及分表分库
    十年河东,十年河西,莫欺少年穷学无止境,精益求精参考:https://furion.baiqian.ltd/docs/dbcontext-read-writehttps://www.cnblogs.com/atomy/p/15356584.htmlhttps://www......
  • CSP-S 2022游记
    Day-1:睡得巨大多早,23:00就睡了。Day0:起得巨大多晚,非常有精神,然后模拟赛就挂了40pts。Day1:可能是昨天睡得太好了,也可能是紧张,到晚上完全睡不着,凌晨两点钟才睡着,五点的......
  • 「 游记 」CSP-S 2022
    CSP-S2022比赛时间\(2022.10.29-14:30\sim18:30\)赛时\(14:30\sim14:40\)把题目看完了,觉得\(T1,T2\)有点思路,\(T3\)只会暴力,\(T4\)对题意有点懵。\(14:4......
  • CSP-S2022 游寄
    首先,关于这次考试,我只能说是真的完全出乎意料了。\(0h\)~\(2h\)都在想T1,当时想了三个方法,但前两个方法都有问题,所以改了很多次代码。其实T1打这么久就是本次考试炸......