异步回调代码,很容易就写出下面这样的不断嵌套的代码。如果还夹杂着各种逻辑的话,可读性会很差,还容易出错。
AsyncLoadRes("ResA", function(textA) print("ResA load finish") AsyncLoadRes("ResB", function(textB) print("ResB load finish") AsyncLoadRes("ResC", function(textC) print("ResC load finish") print(textA, textB, textC) end) end) end)
接下来把上面的多层嵌套优化下
回调内不直接写逻辑,而是调用对象的doNext函数
local obj1 = { value = nil, doNext = nil } AsyncLoadRes("ResA", function(textA) obj1.value = textA obj1.doNext(textA) end) local obj2 = { value = nil, doNext = nil } obj1.doNext = function(textA) print("ResA load finish") AsyncLoadRes("ResB", function(textB) obj2.value = textB obj2.doNext(textB) end) end local obj3 = { value = nil, doNext = nil } obj2.doNext = function(textB) print("ResB load finish") AsyncLoadRes("ResC", function(textC) obj3.value = textC obj3.doNext(textC) end) end obj3.doNext = function(textC) print("ResC load finish, all loaded") end
再把上面的代码调整下
doNext改成了含有run方法的对象,objX.doNext(xxx)改成objX.doNextObj.run(textA)
local obj1 = { value = nil, doNextObj = nil } AsyncLoadRes("ResA", function(textA) obj1.value = textA obj1.doNextObj.run(textA) end) local obj2 = { value = nil, doNextObj = nil } obj2.run = function(textA) print("ResA load finish") AsyncLoadRes("ResB", function(textB) obj2.value = textB obj2.doNextObj.run(textB) end) end obj1.doNextObj = obj2 local obj3 = { value = nil, doNextObj = nil } obj3.run = function(textB) print("ResB load finish") AsyncLoadRes("ResC", function(textC) obj3.value = textC obj3.doNextObj.run(textC) end) end obj2.doNextObj = obj3 local obj4 = { value = nil, doNextObj = nil } obj4.run = function(textC) print("ResC load finish, all loaded") end obj3.doNextObj = obj4
为什么要这么改?
因为这样改之后,obj之间就组成了一个单向链表,为后面还要实现的一些功能增加了可能性。
对上面的代码稍微封装下,就可以得到第1版的promise
---@class PromiseV1 local PromiseV1 = {} PromiseV1.__cname = "Promise" PromiseV1.__index = PromiseV1 function PromiseV1.new() local inst = {} setmetatable(inst, PromiseV1) inst:ctor() return inst end function PromiseV1:ctor() self.m_Value = nil self.m_DoNextObj = nil self.m_Run = nil end function PromiseV1:Next(obj, run) obj.m_Run = run self.m_DoNextObj = obj end function PromiseV1:SetFinished(v) if nil == self.m_Value then self.m_Value = v self.m_DoNextObj.m_Run(v) end end
用法
local obj1 = PromiseV1.new() AsyncLoadRes("ResA", function(textA) obj1:SetFinished(textA) end) local obj2 = PromiseV1.new() local loadResB = function(textA) print("ResA load finish") AsyncLoadRes("ResB", function(textB) obj2:SetFinished(textB) end) end obj1:Next(obj2, loadResB) local obj3 = PromiseV1.new() local loadResC = function(textB) print("ResB load finish") AsyncLoadRes("ResC", function(textC) obj3:SetFinished(textC) end) end obj2:Next(obj3, loadResC) local obj4 = PromiseV1.new() local printContent = function(textC) print("ResC load finish, all loaded") end obj3:Next(obj4, printContent)
标签:function,异步,obj3,obj2,end,nil,lua,promise,local From: https://www.cnblogs.com/sailJs/p/18355888