很久以前就学习过Async和Promise,但总是一知半解的。

今天在写NodeJS的时候,发现好多第三方库使用回调,这样在实际操作中会出现多重回调,这就是传说中的JS回调地狱。

举个例子

有一个方法调用redis,访问一个Hash对象表,获取到返回值后,将返回值插入到redis的另外一个Hash对象表中。

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方法。

通过这个方式,我们可以对上面的代码进行简化,具体如下:

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】 使用Async 和 Promise 完美解决回调地狱的更多相关文章

  1. 使用ES6的Promise完美解决回调地狱

    相信经常使用ajax的前端小伙伴,都会遇到这样的困境:一个接口的参数会需要使用另一个接口获取. 年轻的前端可能会用同步去解决(笑~),因为我也这么干过,但是极度影响性能和用户体验. 正常的前端会把接口 ...

  2. ES6(promise)_解决回调地狱初体验

    一.前言 通过这个例子对promise解决回调地狱问题有一个初步理解. 二.主要内容 1.回调地狱:如下图所示,一个回调函数里面嵌套一个回调函数,这样的代码可读性较低也比较恶心 2.下面用一个简单的例 ...

  3. promise对象解决回调地狱

    先放一张图片感受一下回调地狱 看起来是真的很让人头痛的东西 而现在我这里使用promise对象来解决回调地狱 采用链式的 then,可以指定一组按照次序调用的回调函数. 这时,前一个 then 里的一 ...

  4. Promise如何解决回调地狱

    为什么要有promise:解决(回调地狱)的问题 ### 回调地狱: ```js //跟以前的if条件地狱很像 // if(){ // if(){ // if(){ // } // } //} $.g ...

  5. 回调地狱以及用promise怎么解决回调地狱

    哈哈哈,我又又又回来了,不好意思,最近枸杞喝的比较到位,精力比较旺盛. 现在我们来聊一聊啥是回调地狱,注意是回调地狱啊   不是RB人民最爱拍的那啥地狱啊,来吧,上车吧少年,这是去幼儿园的车 都让开, ...

  6. Promise,async/await解决回调地狱

    先说一下async的用法,它作为一个关键字放到函数前面,用于表示函数是一个异步函数,因为async就是异步的意思, 异步函数也就意味着该函数的执行不会阻塞后面代码的执行. 写一个async 函数 as ...

  7. async + promise 解决回调地狱

    // 解决异步回调地狱的方案: async + promise async function writeFile() {   // 打开文件   const fd = await new Promis ...

  8. Promise解决回调地狱

    Promise是JavaScript异步操作解决方案.介绍Promise之前,先对异步操作做一个详细介绍. JavaScript的异步执行 概述 Javascript语言的执行环境是”单线程”(sin ...

  9. 基于PROMISE解决回调地狱问题

    回调地狱问题: 在使用JavaScript时,为了实现某些逻辑经常会写出层层嵌套的回调函数,如果嵌套过多,会极大影响代码可读性和逻辑,这种情况也被成为回调地狱.比如说你要把一个函数 A 作为回调函数, ...

随机推荐

  1. Android Button常用法

    常用属性: <Button android:id="@+id/btn_1" android:layout_width="match_parent" and ...

  2. ant 执行jmeter

    构建-invoke ant -properties jmeter.home=/home/userapp/apps/apache-jmeter-5.0report.title=kyh_register_ ...

  3. 一次多个数据库tnsping及登录单点登录需求

    [环境介绍] 系统环境:Linux + Oracle 11.2.0.4.0 + python 2.7.10 [背景描述] 需求:因为涉及生产数据库较多,业务夸多个数据库使用.当收到业务有些影响时,数据 ...

  4. vue+element 正则表达式进行表单验证

    <template> <el-form :model="form" label-width="115px" ref="form&qu ...

  5. java常见题目总结

    编写多线程程序的几种方法:java5以前可以通过继承Thread类或者实现Runnable接口,重写run方法来定义线程行为:java5以后出现了另一种方式,实现Callable接口,该接口的call ...

  6. 20155324《网络对抗》Exp1 PC平台逆向破解(5)M

    20155324<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为~pwn1~的~linux~可执行文件. 该程序正常执行流程是:~main~调用~foo~ ...

  7. VLAN原理解释

    转发至http://network.51cto.com/art/201409/450885.htm 为什么需要VLAN 1. 什么是VLAN? VLAN(Virtual LAN),翻译成中文是“虚拟局 ...

  8. Microsoft Internet Explorer v11 / XML External EntityInjection 0day

    [+] Credits: John Page (aka hyp3rlinx) [+] Website: hyp3rlinx.altervista.org[+] Source:  http://hyp3 ...

  9. webpack之proxyTable设置跨域

        可以看看这个视频中的介绍 :https://ke.qq.com/course/350693?tuin=f158ed6

  10. 简单的Web日志处理细节