用Lua的coroutine在实现异步逻辑的妙处
发现用coroutine处理登陆,交易等异步流程的问题非常简单清晰。同比c++的代码不需要state这个东西。
直接上登陆的代码:
function co_client_login(User)
send_msg_to_loginserver()
msg = wait_msg_login(User,{msg_loginserver_logined})
if (not msg.ok) then
return
end
while(true) do
msg = wait_msg_login(User,{msg_create_char,msg_del_char,msg_select_char})
if (msg.type == msg_create_char) then
--...
elseif (msg.type == msg_del_char) then
--...
elseif(msg.type == msg_select_char) then
send_msg_to_dbserver(msg)
msg = wait_msg_login(User,{msg_dbserver_charinfo})
if (msg.char_data) then
User.char=create_char(msg.char_data)
enter_game(User.char)
return
end
end
end
end
function on_msg_client_login(User)
User.threads.co_login = create_corroutine(co_client_login)
end
function wait_msg_login(User,msgs)
User.threads.co_login_wait_msgs = msgs
end
function is_wait_msg_login(User,msg)
return is_in_table(User.threads.co_login_wait_msgs,msg)
end
function on_msg_login(User,msg)
if is_wait_msg_login(msg.type) then
resume(User.threads.co_login, msg)
end
end
function on_msg_loginserver_logined(User,msg)
on_msg_login(User,msg)
end
function on_msg_dbserver_chardata(User,msg)
on_msg_login(User,msg)
end