首页 > 其他分享 >lua版promise实现 - 从异步回调多层嵌套开始

lua版promise实现 - 从异步回调多层嵌套开始

时间:2024-08-14 23:38:02浏览次数:8  
标签:function 异步 obj3 obj2 end nil lua promise local

异步回调代码,很容易就写出下面这样的不断嵌套的代码。如果还夹杂着各种逻辑的话,可读性会很差,还容易出错。

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

相关文章

  • M3KE: A Massive Multi-Level Multi-Subject Knowledge Evaluation Benchmark for Chi
    文章目录题目摘要简介相关工作M3KE实验结论题目M3KE:面向中文大型语言模型的海量多层次多学科知识评估基准论文地址:https://arxiv.org/abs/2305.10263项目地址:https://github.com/tjunlp-lab/M3KE摘要    大型语言模型最近在跨任务泛化、指令跟随等多个......
  • Java注解详解:@Async异步
    使用@Async进行异步方法调用@Async是Spring框架里的一个小工具,能让你的方法在后台偷偷跑起来,不影响主线程的工作。这个方法特别适合用来处理那些不需要立即给用户反馈的任务,比如发个邮件啊,处理个大文件啥的。1.配置异步支持首先,你得在Spring配置类里开个绿灯,让......
  • vue3的defineAsyncComponent是如何实现异步组件的呢?
    前言在上一篇给我5分钟,保证教会你在vue3中动态加载远程组件文章中,我们通过defineAsyncComponent实现了动态加载远程组件。这篇文章我们将通过debug源码的方式来带你搞清楚defineAsyncComponent是如何实现异步组件的。注:本文使用的vue版本为3.4.19欧阳写了一本开源电子书vue3编......
  • JS Promise 一分钟带你深度理解
    JSPromise一分钟带你深度理解文章目录JSPromise一分钟带你深度理解一、什么是Promise?二、为什么使用Promise?三、基础知识四、创建Promise五、Promise使用1、链式调用2、顺序执行3、处理多个Promise4、错误处理六、高级用法七、最佳实践八......
  • 使用C语言构建Lua库
    Lua本身是用C语言编写的,因此使用C编写扩展可以更好地与Lua引擎集成,减少性能瓶颈,同时C语言提供了对底层硬件和操作系统功能的直接访问能力,让Lua可以通过C扩展来实现对文件系统、网络等高级功能的支持。因为C语言非常适合模块化编程,可以很容易地将复杂的Lua功能拆......
  • 关于异步编程和多线程的高级.NET Core面试题
    以下是一些关于异步编程和多线程的高级.NETCore面试题。这些问题涵盖了从基础概念到复杂应用的各个方面,可以帮助评估候选人在异步编程和多线程开发方面的能力。1.异步编程基础在.NETCore中,异步编程的基本原理是什么?async和await关键字的作用是什么?如何在.NETCore中使用......
  • Fabse的同步异步复制转换
    240711-Fabse的同步/异步复制转换1.主从搭建详情请见240710-Fbase一主一从安装文档.md安装文档。2.主从复制方式查看2.1判断主从库执行select*frompg_stat_replication;在主库上有结果,在备库上无结果;select*frompg_stat_replication;执行select*frompg_stat......
  • PostgreSQL的同步异步复制简介及互相转换
    PostgreSQL的同步/异步复制简介及互相转换一、介绍1.概念1.1.同步流复制同步流复制就是当主库发生变化,比如有一条DML语句产生了WAL日志后,通过后台进程传送到备库,备库必须要应用这个日志,然后向主库返回一个成功应用的信号,主库才可以成功的commit;否则主库会一直等待到备库成功......
  • AJAX - 利用XML和Promise封装简易版axios,了解axios底层原理
     AJAX原理-XMLHttpRequest定义:XMLHttpRequest(XHR)对象用于与服务器交互。通过XMLHttpRequest可以在不刷新页面的情况下请求特定URL,获取数据。这允许网页在不影响用户操作的情况下,更新页面的局部内容。XMLHttpRequest 在 AJAX 编程中被大量使用。关系:axios内部采用......
  • Lua语言基础学习:安装Lua和Lua库管理工具
     Lua语言简介  Lua是一种轻量、高效、可嵌入的脚本语言,由巴西里约热内卢天主教大学的研究小组于1993年开发,Lua的解释器非常小巧,编译后的体积很小(如完整解释器不过200KB),这使得它非常适合嵌入到其他应用程序中。Lua的执行速度快,内存占用低,特别适用于需要高性能的应用场景,支......