经过前面的学习我们已经了解了目前JS中常用的异步编程方式,如Promise、Generator、async/await,本文将通过以上方式来解决回调地狱问题。

回顾一下异步编程的方式,早些年为了实现JS的异步编程,一般都采用回调函数的方式,比较典型的是事件的回调,但是使用回调函数来实现存在一个很常见的问题,那就是回调地狱。

1. 什么是回调地狱

异步任务中回调函数的层层嵌套,随着嵌套的层数增加,代码的可读性和维护性变差,常见的回调函数比如在setTimeout中,以函数作为参数进行调用。

fs.redFile(A,'UTF-8',function(err,data){// 第一层fs.redFile(B,'UTF-8',function(err,data){// 第二层fs.redFile(C,'UTF-8',function(err,data){// 第三层fs.redFile(D,'UTF-8',function(err,data){// ......})})})
})

利用回调函数实现异步编程的场景有很多,如下:

  • ajax请求回调
  • 定时器中的回调
  • 事件回调
  • Nodejs中的回调

接下来,讨论如何解决回调地狱的问题

2. 回调地狱的解决

2.1.1 promise初级版本

function read(url){return new Promise((resolve, reject) => {fs.readFil(url, 'UTF-8',(err, data)=>{if(err){reject(err)}else{resolve(data)}      })})
}
read(A).then(data=>{return read(B)
}).then(data=>{return read(C)
}).then(data=>{return read(D)
}).catch(reason=>{console.log(reason);
})

这样写的方法相比于回调函数的可读性是增加了,接下来用Promise的API,all方法进行实现

2.1.2 Promise进阶版本

function read(url){return new Promise((resolve,reject)=>{// 待执行的异步函数fs.readFil(url,'UTF-8',(err,data)=>{if(err){reject(err)}else{resolve(data)}})})
}
Promise.all([read(A),read(B),read(C),read(D)]).then(data=>{console.log(data);
}).catch(err=>{console.log(err);
})

相比于上面的方式,用all方法看起来更加地简洁。

2.2 Generator

为什么第一次传递的参数无效呢?

function * gen(){let a = yield 111;console.log(a);let b = yield 222;console.log(b);let c = yield 333;console.log(c);
}
let t = gen()
console.log(t.next(1)); // 第一次传递参数无效,无打印结果
console.log(t.next(2));
console.log(t.next(3));
console.log(t.next(4));

2.3 async/await

代码清晰,异步代码看起来像同步一样。

function teastWait(){return new Promise((resolve, reject)=>{setTimeout(function(){console.log("testWait");resolve()}, 1000);})
}async function testAwaitUse(){await teastWait()console.log("hello");return 123
}
console.log(testAwaitUse());
// 猜测打印顺序
// hello,testWait无await情况下;存在则先打印testwait,hello

3. 总结

如何解决回调地狱问题相关推荐

  1. 什么是回调函数?回调函数有什么缺点?如何解决回调地狱问题?

    什么是回调函数?回调函数有什么缺点?如何解决回调地狱问题? 参考文章: (1)什么是回调函数?回调函数有什么缺点?如何解决回调地狱问题? (2)https://www.cnblogs.com/kzxi ...

  2. Promise使用,return的运用,解决回调地狱

    Promise使用,return的运用,解决回调地狱 回调地狱 httpBookModel.getHotList().then((res) => {console.log(res)httpBoo ...

  3. Promise解决回调地狱写法

    这里可以使用Promise来解决回调地狱的问题! 那么我们这里有一个需求,就是我们需要读取三个 .txt 文件,需要第一个文件读取完成后才能读取第二个文件以此类推. 那么这里来一个Promise的错误 ...

  4. Promise(解决回调地狱)

    Promise() 对象: 存在三种状态: //进行时 pending// 成功 resolve//失败 reject 执行语句: let promise= new Promise((resolve, ...

  5. ES6----promise方法解决回调地狱问题

    ES6–promise方法解决回调地狱问题 要解决回调地狱问题,首先要了解回调地狱的产生是由于早期的javascript只支持回调函数来表现异步操作完成,由于业务逻辑复杂时,就会出现一个串联多个异步操 ...

  6. promise解决回调地狱(callback hell)

    promise解决回调地狱(callback hell) 具体参考 阮一峰,ES6标准入门 在我们需要对一个异步操作进行频繁的调用的时候,且要保证一步操作的顺序,可能会出现 回调地狱(callback ...

  7. Promise的基础使用与生成器配合Promise解决回调地狱

    经过几天对Promise的了解,希望可以帮助到大家. 什么是回调地狱         说起回调地狱 首先想到的是异步 在js中我们经常会大量使用异步回调,常用的ajxa请求 来看下面这段代码: fun ...

  8. 回调地狱的产生,以及如何解决回调地狱

    前言 在了解回调地狱之前,我们先来了解两个概念: 1. 回调函数 当一个函数作为参数传入另一个参数中,并且它不会立即执行,只有当满足一定条件后该函数才可以执行,这种函数就称为回调函数.我们熟悉的定时器 ...

  9. promise解决回调地狱的问题

    什么是回调地狱 怎么解决回调地狱的问题 要了解什么是回调地狱,首先要了解 什么是同步,什么是异步函数 同步函数:当一个函数是同步执行时,那么当该函数被调用时不会立即返回,直到该函数要做的事情全部做完之 ...

  10. 解决回调地狱终极方法 - ES7新增 - async 和 await

    概念: ES7 新增的 专门 配合 promise封装函数一起执行的程序 async: - 关键字 - 异步的 await: - 关键字 - 等待 作用: 让 异步程序 按照顺序 一个一个的执行 也是 ...

最新文章

  1. java object finalize_Java Object finalize() 方法
  2. spring websocket源码分析续Handler的使用
  3. 如何在VC中创建动态数组
  4. (五)Unity插件生成
  5. SQL SERVER 中 实现主表1行记录,子表多行记录 整合成一条虚拟列
  6. 命令逐行显示_Linux命令和Shell脚本学习随笔3
  7. python条件判断true_Python中的True,False条件判断实例分析
  8. 通货膨胀时是否提前还本付息--郎咸平
  9. Android开发笔记(一百二十三)下拉刷新布局SwipeRefreshLayout
  10. Android架构 armeabi、armeabi-v7a、arm64-v8a、x86详解
  11. 在线HTTP接口测试 - HTTP GET/POST模拟请求测试工具
  12. Predator:比微软Kinect更强的视频追踪算法——来自捷克博士论文
  13. mysql超市进存销管理系统_企业进存销管理系统.doc
  14. matlab dll 通达信,通达信DLL插件实战篇,怎样制作我们想要的函数
  15. C++大作业 商品库存管理系统
  16. 怎样成为“吃鸡”沙漠霸主?掌握资源点是关键
  17. python search用法,Python-re中search()函数的用法详解(查找ip)
  18. 英国脑科学领域_来自英国A级算法崩溃的数据科学家的4课
  19. hx-2.4g-rx-2_Rx-如果话务员可以讲话!
  20. python excel数据处理?

热门文章

  1. Java计算机毕业设计图片分享网站源码+系统+数据库+lw文档
  2. matlab 蒙特卡洛工具箱_量化投资_轻松实现MATLAB蒙特卡洛方法建模
  3. 项目数据验证_如何快速发货和验证新项目
  4. reverse函数(C++)
  5. 一级建造师通信与广电工程140分经验分享
  6. 网购火车票攻略(十一长假版)
  7. Android推送服务的几种实现方式
  8. Android端离线推送语音播报原理实现
  9. 如果你喜欢销售,那么你一定要看!经典之作!
  10. python三角形判断白盒测试的代码_白盒测试代码应该怎么测试