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

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

第三十六章 使用 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时才填充。
相关文章
|
JavaScript 前端开发 Go
第三十四章 使用 CSP 进行基于标签的开发 - Hyperevent例子
第三十四章 使用 CSP 进行基于标签的开发 - Hyperevent例子
|
前端开发 JavaScript 编译器
第三十三章 使用 CSP 进行基于标签的开发 - 使用Hyperevents #server和#call调用服务器端方法
第三十三章 使用 CSP 进行基于标签的开发 - 使用Hyperevents #server和#call调用服务器端方法
|
前端开发 程序员 Go
第三十二章 使用 CSP 进行基于标签的开发 - 服务器端方法
第三十二章 使用 CSP 进行基于标签的开发 - 服务器端方法
|
JavaScript 前端开发 Go
第三十一章 使用 CSP 进行基于标签的开发 - 转义和引用HTTP输出
第三十一章 使用 CSP 进行基于标签的开发 - 转义和引用HTTP输出
第三十章 使用 CSP 进行基于标签的开发 - 控制流
第三十章 使用 CSP 进行基于标签的开发 - 控制流
|
SQL 存储 编译器
第二十九章 使用 CSP 进行基于标签的开发 - 服务器端方法
第二十九章 使用 CSP 进行基于标签的开发 - 服务器端方法
|
JavaScript 前端开发 Go
第二十八章 使用 CSP 进行基于标签的开发 - 运行时表达式
第二十八章 使用 CSP 进行基于标签的开发 - 运行时表达式
|
XML JavaScript 前端开发
第二十七章 使用 CSP 进行基于标签的开发 - CSP 标记语言
第二十七章 使用 CSP 进行基于标签的开发 - CSP 标记语言
|
XML 缓存 安全
第二十六章 使用 CSP 进行基于标签的开发
第二十六章 使用 CSP 进行基于标签的开发
|
算法 Go Python
CSP 202203-2 出行计划 python 差分算法
CSP 202203-2 出行计划 python 差分算法
CSP 202203-2 出行计划 python 差分算法