KBEngine官方论坛

 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 配置 开服
查看: 63|回复: 12

返回和回調使用原則

[复制链接]

20

主题

148

帖子

424

积分

中级会员

Rank: 3Rank: 3

积分
424
发表于 2018-12-4 18:23:34 | 显示全部楼层 |阅读模式
服务端暴露给客户端的接口结果return或回调(clientMethod)有什么讲究吗?除了返回参数必须用多个时和一些结果需异步通知采用回调外。
其他在请求函数中就self.client.on**的跟直接return有区别吗?

回复

使用道具 举报

5

主题

3591

帖子

214748万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2147483647

引擎扛把子

发表于 2018-12-5 11:57:57 | 显示全部楼层
远程调用没有返回值。
QQ:3603661
3603661@qq.com
回复

使用道具 举报

20

主题

148

帖子

424

积分

中级会员

Rank: 3Rank: 3

积分
424
 楼主| 发表于 2018-12-10 18:39:36 | 显示全部楼层
在一个表管理实体中管理sql,如果是查询,结果回调后要什么把结果返给Account?
sql回调函数写在Account,当做参数传给管理实体方法?
或者在管理实体的回调函数中获取当前Account,然后直接操作Account的变量或方法?
还是有更好的方式来处理?
回复

使用道具 举报

5

主题

3591

帖子

214748万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2147483647

引擎扛把子

发表于 2018-12-10 20:28:58 | 显示全部楼层
搜一下Functor.py
QQ:3603661
3603661@qq.com
回复

使用道具 举报

5

主题

3591

帖子

214748万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2147483647

引擎扛把子

发表于 2018-12-10 20:29:26 | 显示全部楼层
包装一个可识别的回调参数
QQ:3603661
3603661@qq.com
回复

使用道具 举报

20

主题

148

帖子

424

积分

中级会员

Rank: 3Rank: 3

积分
424
 楼主| 发表于 2018-12-10 21:18:21 | 显示全部楼层
  1. class DataBaseQuery():#封装的库操作类

  2.         def __init__(self, parentId, command, callback, functionName, *args):
  3.                 self.command = command
  4.                 self.callback = callback
  5.                 self.functionName = functionName
  6.                 self.id = parentId
  7.                 self.args = args

  8.         def execute(self):
  9.                 DEBUG_MSG("DataBaseQuery[%i].execute  functionName=%s" % (self.id, self.functionName))
  10.                 KBEngine.executeRawDatabaseCommand(self.command, self.__mySqlCallback, self.id)
  11.                 # KBEngine.executeRawDatabaseCommand(self.command)

  12.         def __mySqlCallback(self, result, rows, insertid, error):
  13.                 '''
  14.                 回调参数详见:
  15.                 https://www.comblockengine.com/docs/api/baseapp/modules/KBEngine.executeRawDatabaseCommand/
  16.                 :param result:结果集合
  17.                 :param rows:影响的行数
  18.                 :param insertid:自增id
  19.                 :param error:错误信息
  20.                 :return:
  21.                 '''
  22.                 DEBUG_MSG("DataBaseQuery[%i].__mySqlCallback  functionName=%s" % (self.id, self.functionName))
  23.                 self.callback(result, rows, insertid, error, self.args)

  24.         def __del__(self):
  25.                 DEBUG_MSG("DataBaseQuery[%i].__del__" % (self.id))
复制代码
  1. class HomeStatusMgr(KBEngine.Entity):#管理实体
  2.         def queryStatus(self, PID):
  3.                 '''

  4.                 :param PID:
  5.                 :return:
  6.                 '''
  7.                 mysqlCmd = "SELECT * FROM t_player_home_status WHERE PID='{0}' ORDER BY id;".format(PID)

  8.                 DEBUG_MSG("HomeStatusMgr[%i].insertStatus mysqlCmd=%s" % (self.id, mysqlCmd))
  9.                 self.query = DataBaseQuery(self.id, mysqlCmd, self.__mySql_query,
  10.                                            sys._getframe().f_code.co_name)
  11.                 self.query.execute()

  12.         def __mySql_query(self, result, rows, insertid, error, args):
  13.                 DEBUG_MSG("HomeStatusMgr[%i].__mySql_query" % (self.id))
  14.                 DEBUG_MSG(result, rows, insertid, error)
  15.                 # 对象清空,允许下次查询
  16.                 self.query = None
  17.                 # 数据解析

  18.                 if result != None:  # 查到数据
  19.                         ERROR_MSG("HomeStatusMgr[%i].__mySql_query dataListlen=%i " % (self.id, len(result)))
  20.                 elif error != None:  # 服务器错误哦
  21.                         ERROR_MSG("HomeStatusMgr[%i].__mySql_query errMsg=%s " % (self.id, error))
  22.                 else:  # 返回插入结果
  23.                         DEBUG_MSG("HomeStatusMgr[%i].__mySql_query insertId=%i " % (self.id, insertid))
复制代码

回复

使用道具 举报

20

主题

148

帖子

424

积分

中级会员

Rank: 3Rank: 3

积分
424
 楼主| 发表于 2018-12-10 21:24:29 | 显示全部楼层
上面是我现在的做法。Funtor要什么用啊,如果我要在__mySql_query中回调结果到Account实体
回复

使用道具 举报

20

主题

148

帖子

424

积分

中级会员

Rank: 3Rank: 3

积分
424
 楼主| 发表于 2018-12-11 00:37:42 | 显示全部楼层
  1. self.query = DataBaseQuery(self.id, mysqlCmd, Functor.Functor(self.__mySql_query, ‘识别参数’),
  2.                                            sys._getframe().f_code.co_name)
复制代码

大概知道什么用Functor了,这样吧。
------------------------------------------------
那如果我要在Account中处理回调给客户端的,是不是就得在表管理类queryStatus接口中也定义一个回调函数参数,然后在__mySql_query再触发这个回调函数给Account;
还是说没必要那样,Account调queryStatus的时候直接多传一个当前Account的dbid,然后在__mySql_query中根据dbid找到对应的Account实体,直接在这里触发客户端回调。
回复

使用道具 举报

5

主题

3591

帖子

214748万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2147483647

引擎扛把子

发表于 2018-12-11 11:10:50 | 显示全部楼层
你要触发给account, 直接设置account的方法不就可以了?
QQ:3603661
3603661@qq.com
回复

使用道具 举报

20

主题

148

帖子

424

积分

中级会员

Rank: 3Rank: 3

积分
424
 楼主| 发表于 2018-12-11 11:46:21 | 显示全部楼层
就是直接在管理实体中找到当前Account,调用Account的方法是吗?
---------------------------------------------------------------------------------
我现在的做法是account调queryStatus的时候传入一个函数f,然后在管理实体中调用f传入结果;这样也可以吧,就不知道这种做法好不好?
回复

使用道具 举报

5

主题

3591

帖子

214748万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2147483647

引擎扛把子

发表于 2018-12-11 13:34:50 | 显示全部楼层
都可以,看你怎么设计
QQ:3603661
3603661@qq.com
回复

使用道具 举报

56

主题

163

帖子

1032

积分

金牌会员

Rank: 6Rank: 6

积分
1032
发表于 2018-12-11 13:49:07 | 显示全部楼层
异步逻辑复杂的话用协程吧
回复

使用道具 举报

20

主题

148

帖子

424

积分

中级会员

Rank: 3Rank: 3

积分
424
 楼主| 发表于 2018-12-11 15:13:45 | 显示全部楼层
zainwong 发表于 2018-12-11 13:49
异步逻辑复杂的话用协程吧

嗯,暂时用主动回调实现了,后面看下是否有必要引入 协程——这块现在还不熟。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|KBEngine Forum

GMT+8, 2018-12-19 04:51 , Processed in 0.031414 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表