加载中…
个人资料
步惊云
步惊云
  • 博客等级:
  • 博客积分:0
  • 博客访问:10,636
  • 关注人气:3
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

在datasnap中使用回调

(2020-11-09 12:32:54)
分类: FMX$Datasnap

首先要理解什么是回调函数,可以参考这篇博文什么是回调函数

       DataSnap支持在客户端写的回调函数,也就是服务端的主调函数的参数可以是一个客户端写好的回调函数名,这样调用主调函数时,客户端的回调函数也将会调用。

例如,我们修改EchoString方法,向其中添加回调支持,EchoString方法是主调函数:

Function EchoString(Value: string; callback: TDBXcallback): string;

TDBXcallback类定义在DBXJSON单元,这是一个虚拟类,是对客户端回调函数的包装。

在我们实现服务端主调EchoString方法前,先搞清楚如何在客户端定义回调函数(毕竟,这是一个可以让服务端调用的客户端方法)。

在客户端,我们必须定义一个新类,从TDBXCallbacK继承,重写其Execute方法.

type

    TCallbackClient = class(TDBXCallback)

public

    function Execute(const Arg: TJSONValue): TJSONValue; override;

end;

在Execute方法中,有一个TJSONValue类型的参数,而且返回值也是TJSONValue,TJSONValue是Json数据类型TJSONObject, TJSONArray, TJSONNumber, TJSONString, TJSONTrue, TJSONFalse, TJSONNull的父类,也就是可以传递和返回多种数据类型。

可以复制(Clone)这个参数然后设置其具体内容.Execute方法也返回一个TJSONValue类型的值,这里我们只返回同样的值。

function TCallbackClient.Execute(const Arg: TJSONValue): TJSONValue;//实现回调函数

var

    Data: TJSONValue;

begin

    Data := TJSONValue(Arg.Clone);//深度复制

    ShowMessage('Callback: ' + TJSONObject(Data).Get(0).JSonValue.value);

    Result := Data

end;

例如, 在方法实际返回前(如方法正在执行),回调函数将显示EchoString方法传递参数的值。服务端新的EchoString方法实现需要将String值赋给一个TJSONObject对象,并将其传递给回调函数.如下:

function TServerMethods2.EchoString(Value: string; callback: TDBXcallback): string;//实现主调函数

var

    msg: TJSONObject;

    pair: TJSONPair;

begin

    Result := Value;

    msg := TJSONObject.Create;

    pair := TJSONPair.Create('ECHO', Value);

    pair.Owned := True;

    msg.AddPair(pair);

    callback.Execute(msg);

end;

注意这个回调函数将在客户端执行—然后在服务端Echostring方法执行完毕前返回

最后,在客户端调用EchoString方法也需要修改,因为我们现在要提供一个回调类TCallbackClient的实例,如

下所示:

var

MyCallback: TCallbackClient;

begin

    MyCallback := TCallbackClient.Create;

try

    Server.EchoString(Edit1.text, MyCallback);

finally

    MyCallback.Free;

end;

end;

为何datasnap的EchoString主调函数不使用函数类型为参数,而要使用 TDBXcallback这个类?

其实,要在datansap与客户端传递信息,数据格式是要受限制的,除一般基础类型外,能够支持的数据类型还有Json、TStream,包括过程类型、类类型、接口、数组这些类型是不能传递的。所以,EchoString不能直接使用普通过程类型的参数。

TDBXcallback这个类其实是虚拟类,它是对回调函数 Execute的包装而已。TDBXcallback是DBXJSON单元实现的类,这个单元是对专门对Json类型进行处理而设计的,可以用于服务器与客户端的通信。



0

阅读 评论 收藏 转载 喜欢 打印举报/Report
后一篇:什么是泛型
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

    后一篇 >什么是泛型
      

    新浪BLOG意见反馈留言板 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有