zoukankan      html  css  js  c++  java
  • 【JavaScript】 使用Async 和 Promise 完美解决回调地狱

    很久以前就学习过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();
    		});
    	})
    }
    

      

     通过上面这个方法,可以将回调函数拆开,依次等待回调结束后再执行下一步,而不用将回调嵌套,大大提高了代码的可阅读性。

  • 相关阅读:
    VisualStudioCode网页开发常用插件
    java项目报错 :A class file was not written. The project may be inconsistent...
    java抽象类及接口
    博客园首页美化----js添加分割线
    WordPress安全/速度优化(此篇持续更新)
    wordpress宝塔lnmp下安装以及调优(此篇持续更新)
    wordpress之avada安装全过程(此篇持续更新)
    Wordpress之使用阿里云Oss存储
    Linux基础学习(一)虚拟机安装&CentOS8.1安装
    docker安装配置使用
  • 原文地址:https://www.cnblogs.com/nonkicat/p/9205295.html
Copyright © 2011-2022 走看看