写点什么

Javascript 之 async 四重奏(一)

  • 2019-12-31
  • 本文字数:1256 字

    阅读完需:约 4 分钟

Javascript之async四重奏(一)

异步操作一直以来都是 JavaScript 开发者十分热衷的话题,从 callback、promise 到 generator 再到 async,其过程就像一首奏鸣曲,在向我们讲述着 JavaScript 异步操作的漫漫进程。


Callback hell 的峥嵘岁月


Callback Hell


在 ES6 之前,我们更多的是采用 callback 的方式处理异步的过程,http://callbackhell.com/(如无法打开请复制链接至浏览器打开)中将类似于以下代码中诸多的’)}’这种形状称为’回调地狱’:


(注:左右/上下滑动屏幕可查看全部代码)


fs.readdir(source, function (err, files) { if (err) {   console.log('Error finding files: ' + err) } else {   files.forEach(function (filename, fileIndex) {     console.log(filename)     gm(source + filename).size(function (err, values) {       if (err) {         console.log('Error identifying file size: ' + err)       } else {         console.log(filename + ' : ' + values)         aspect = (values.width / values.height)         widths.forEach(function (width, widthIndex) {           height = Math.round(width / aspect)           console.log('resizing ' + filename + 'to ' + height + 'x' + height)           this.resize(width, height).write(dest + 'w' + width + '_' + filename, function(err) {             if (err) console.log('Error writing file: ' + err)           })         }.bind(this))       }     })   }) }})
复制代码


显然,没有人会保持足够的耐心去阅读这样的代码-----如果嵌套的层级更深的话.


怎么解决 Callback Hell


我们先看如下的一段 Javascript 代码:


(注:左右/上下滑动屏幕可查看全部代码)


fs.readFile(’./example.txt’, ‘utf-8’, (err, content) => {


let queryWord = content.substring(0, 4);


db.find(select * from example where keyword = ${ queryWord }, (err, res) => {


get(/exampleget?count=${res.length}, data => {


console.log(data);


});


});


});


先读取 example.txt 中的关键字段,查询数据库后根据结果请求数据,其中包含的异步操作有:读取文件、查询数据库、请求数据,这种多层的嵌套显然是不利于阅读与维护的,为了解决这种问题,保持代码的结构整齐、浅显易读不失为一种好的方法:


(注:左右/上下滑动屏幕可查看全部代码)


function getData(count) {   get(`/sampleget?count=${count}`, data => {       console.log(data);   });}
function queryDB(kw) { db.find(`select * from sample where kw = ${kw}`, (err, res) => { getData(res.length); });}
function readFile(filepath) { fs.readFile(filepath, 'utf-8', (err, content) => { let keyword = content.substring(0, 5); queryDB(keyword); });}readFile('./sample.txt');
复制代码


对比之下,通过对函数进行命名或者是将函数封装成独立模块,代码会更具有阅读性。


本文转载自 Think 体验设计公众号。


原文链接:https://mp.weixin.qq.com/s/QgC2OjVF4pvltte9V_gkIQ


2019-12-31 15:41668

评论

发布
暂无评论
发现更多内容

架构师训练营第 1 期第 4 周作业

好吃不贵

极客大学架构师训练营

极客时间架构 1 期:第 3 周代码重构 - 命题作业

Null

Python 为什么不支持 switch 语句?

Python猫

Python 编程

架构师训练营第四周作业

尹斌

架构师训练营第三周学习总结

Gosling

极客大学架构师训练营

3. CocoaPods 命令解析 - CLAide

Edmond

ruby ios objective-c CocoaPods PackageManager

如何高质量学习与正确运用设计模式

木香丘

学习 设计模式 实战

架构师训练营第三小结(9.28-10.4)

zjzj2017

架构师训练营第四周学习总结

尹斌

Redis-技术专题-基础介绍

洛神灬殇

架构师训练营第 1 期第 4 周学习总结

好吃不贵

入行架构师之前,这7项技能你要先了解一下

Java架构师迁哥

架构师1期-代码重构作业

ltl3884

极客大学架构师训练营

spring-boot-route(九)整合JPA操作数据库

Java旅途

Java Spring Boot jpa

发几张国庆的照片

亨利笔记

容器 k8s Harbor 镜像

架构师训练营第三周课后作业

Gosling

极客大学架构师训练营

实用威胁建模指南(一)

亚伦碎语

敏捷 安全设计 系统安全 #威胁建模

缓存服务-技术专题-解决方案

洛神灬殇

LeetCode题解:226. 翻转二叉树,递归,JavaScript,详细注释

Lee Chen

大前端 LeetCode

第四周作业

极客大学架构师训练营

有这些要素,架构才完整

北风

架构 架构师之道 架构方法

单例模式

魏小龙

爆赞!这份《Java核心宝典》绝对是面试复习的最佳选择

Java架构之路

Java 程序员 面试 编程语言

极客时间架构 1 期:第 3 周代码重构 - 学习总结

Null

Serverless 多云解决方案 Malagu

木香丘

云计算 Serverless 架构 云原生 Malagu

Malagu 框架介绍

木香丘

云计算 开源 Serverless 架构 框架

Hazelcast IMDG 带你瞬间进入内存计算的时代

张磊

分布式计算 内存管理 分布式缓存 分布式内存网格

基于 Spring Boot 的企业级快速开发框架 BDF3

木香丘

架构 Spring Boot 可视化 后台管理系统

深入剖析go中字符串的编码问题——特殊字符的string怎么转byte?

Gopher指北

后端 string utf-8 Go 语言

架构师训练营第三周作业(9.28-10.4)

zjzj2017

Redis-技术专题- 热点Key如何解决

洛神灬殇

Javascript之async四重奏(一)_语言 & 开发_Think体验设计_InfoQ精选文章