【JavaScript】 使用Async 和 Promise 完美解决回调地狱
很久以前就学习过Async和Promise,但总是一知半解的。
今天在写NodeJS的时候,发现好多第三方库使用回调,这样在实际操作中会出现多重回调,这就是传说中的JS回调地狱。
举个例子
有一个方法调用redis,访问一个Hash对象表,获取到返回值后,将返回值插入到redis的另外一个Hash对象表中。
1 2 3 4 5 6 7 8 9 10 11 12 13 | testCallbackAction(){ let redis = RedisClient(); let key = 'xx' ; redis.hget(redisTable1,key, (err,data)=>{ err&&think.logger.error(err); redis.hset(redisTable2,key,data,(err,data)=>{ console.log(err); console.log(data); }); }) } |
在上面这个方法中,可以看见它嵌套了2个回调函数。随着业务的复杂,必然导致回调函数的无限嵌套。
这时候就可以使用Async和Promise来解决这个问题。
首先要了解一个Promise和Async的概念。
Promise可以看作是一个异步容器。它可以将一个异步调用方法放到一个容器中,在异步处理时,不会直接跳到下一步,而是阻塞,直到异步处理结束并返回一个resolve()方法。
而Ansyc、await 是Promise天生一对的搭档。
在执行Promise时,使用Ansyc将Promise指定为异步方法,然后使用await等待Promise返回resolve方法。
通过这个方式,我们可以对上面的代码进行简化,具体如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | async testCallbackAction(){ let redis = RedisClient(); let key = 'xx' ; let rt = null ; await new Promise((resolve, reject)=>{ redis.hget(redisTable1,key, (err,data)=>{ err&&think.logger.error(err); rt = data; resolve(); }) }) await new Promise((resolve, reject)=>{ redis.hset(redisTable2,key,rt,(err)=>{ console.log(err); resolve(); }); }) } |
通过上面这个方法,可以将回调函数拆开,依次等待回调结束后再执行下一步,而不用将回调嵌套,大大提高了代码的可阅读性。
分类:
JavaScript
, ES6
标签:
JavaScript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?