GA好望角|魔力宝贝私服|魔力私服|魔力私服|GA反外挂

 找回密码
 立即注册
凤凰(QQ:715837)
售前咨询
GA白皮书(客户端)
GA白皮书(服务端)
cgdev.me开发者论坛
放映地(炫斗魔力公益PK服)
新服发布站
欢迎来到GA好望角~
价格公示表
回首页
查看: 2399|回复: 1

非异步与异步await控件的应用

[复制链接]

130

主题

136

帖子

136

积分

管理员

Rank: 9Rank: 9Rank: 9

金钱
2094
号角币
466
发表于 2021-5-17 11:50:34 | 显示全部楼层 |阅读模式
什么是await控件?
  • await控件是一个可以调用服务器函数的控件封装
  • 使用此控件后 可以在客户端中调用服务端的函数 并且异步非堵塞 不会卡线程

使用场景:
可以代替 Cli.Send()发送接收封包数据 避免回调地狱
使用await之后 整个数据通讯过程是流程式的 这样可以使我们更好维护与阅读代码

什么是回调地狱:
在我们跟服务端通讯时 需要把一个函数当做参数 用作数据接收返回
当我们需要通讯的次数过多时 就会产生如下的回调地狱
      
event1(a1,function(ret1)
       event2(ret1,function(ret2)
             event3(ret2,function(ret3)
                  ....
            )
       )
   )
end

而我们希望是 每一个event与服务器通讯之后 可以方便阅读的 如下
      
ret1 =event1(a1)
ret2 =event2(ret1)
ret3 =event3(ret2)


所以await控件由此诞生 你可以像是在写同步代码的方式来书写异步代码

调用条件:
  • 申明控件为await控件 可以参考一下代码
  • 在event函数中 只有鼠标左键单击双击/右键单击双击会触发 其他如鼠标进入/退出等事件 不会触发异步回调
  • 被调用的服务端函数 必须声明在 unsafe 类下
  • 调用参数均为非安全参数 请自行判断参数的正确性

客户端代码:
      
function Myrw_init(view)
    if view.IsInit then   
                view.add(new.bmpbutton("change","chajian_btn.bmp"));    
                view.add(new.bmpbutton("await.change","chajian_btn.bmp"));  
                return;
    end
        
     -- 非异步回调方式调用服务端函数
     local object = view.find("change");
    object.enable = 1;
    object.xpos = 130;
    object.ypos = 60;
    object.event = function(object,event)
                        if event == Cevent.click then                                                   
                                unsafe.sayhello({"早安,熊弟弟"})
                                -- 使用回调函数接收返回数据 任然无法避免回调地狱
                                unsafe.changeMetamo({104870},function (ret)
                                        Cli.SysMessage(tostring(ret[1]),4,3);                
                                end
                                )        
                        end
                
        end
        
     -- 异步回调方式调用服务端函数
     local object = view.find("await.change");
    object.enable = 1;
    object.xpos = 130;
    object.ypos = 60;
    object.event = function(object,event)
                        if event == Cevent.click then                                                    
                                unsafe.sayhello({"早安,熊弟弟"})
                                
                                -- 当执行到unsafe.changeMetamo这里时 线程会被挂起等待ret返回
                                -- 这个过程是异步的 不会卡游戏线程 
                                -- 等待返回后 会自动恢复当时上下线程 这个步骤是自动的 无需关心的
                                local ret = unsafe.changeMetamo({104870});
                                Cli.SysMessage(tostring(ret[1]),4,3);        
                                        
                        end
                
        end
end


服务端代码:
      
function unsafe.sayhello(player,tbl)              
                NLG.SystemMessage(player,tostring(tbl[1]))                                
end                
                                
function unsafe.changeMetamo(player,tbl)
                local metamoid = tonumber(tbl[1])
                Char.SetData(player,%对象_形象%,metamoid);
                Char.SetData(player,%对象_原形%,metamoid);
                Char.SetData(player,%对象_原始图档%,metamoid);
                NLG.UpChar(player);                            
                return {'已经变身成['..metamoid.."] 真漂亮,快给大家看看吧!!"}                                
end        





回复

使用道具 举报

1

主题

191

帖子

191

积分

注册会员

Rank: 2

金钱
104
号角币
0
发表于 2022-3-3 18:43:17 | 显示全部楼层
谢谢大佬的辛勤努力,多谢分享。
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|GA好望角

GMT+8, 2024-4-18 19:48 , Processed in 0.049338 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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