速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

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:41629

评论

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

《后浪》产品经理篇(恶搞版)

静陌

产品经理 后浪

更聪明地学习,而不是苦读——《如何高效学习》

mzlogin

学习

OpenResty部署配置和日志切割

wong

nginx centos openresty

Rust 与区块链四月月刊

Aimee 阿敏

区块链 rust 加密货币 crypto

松哥手把手教你定制 Spring Security 中的表单登录

江南一点雨

Java spring Spring Boot spring security

从一次排查ES线上问题得出的总结——熔断机制

罗琦

elasticsearch 源码分析 circuit break 熔断

sync.Map源码分析

陈思敏捷

源码 源码分析 Go 语言

一文带你看清HTTP所有概念

苹果看辽宁体育

HTTP

松哥手把手带你入门 Spring Security,别再问密码怎么解密了

江南一点雨

Java spring Spring Boot spring security

业余前端的日常

顿晓

学习 大前端 日常 专家 知识体系

如何在一台计算机上安装多个 JDK 版本

mghio

Java jdk 版本管理工具

聊聊我对技术一些性质的认识

Tanzv

技术 思考 新人

Java新技术:封闭类

X.F

Java 架构 编程语言

Android | Tangram动态页面之路(二)介绍

哈利迪

android

MySQL常用权限说明

一个有志气的DB

MySQL 用户研究

Xtrabackup的安装使用

一个有志气的DB

MySQL 工具 数据的分片和备份

设计模式之观察者模式

设计模式

谈谈控制感(5):怎么破控制感损失的局

史方远

职场 心理 成长

让你高效工作与学习的免费工具(1)

石云升

高效工作 效率工具 工具

严选合伙人(二)

Neco.W

创业 重新理解创业 合伙人

游戏夜读 | Scikit-learn迎来0.21之前

game1night

如果你觉得学习 Git 很枯燥,那是因为你还没玩过这款游戏!

GitHubDaily

git GitHub 编程 程序员 开发者工具

Mac 使用笔记

FeiLong

回“疫”录(18):536公里的路

小天同学

疫情 回忆录 现实纪录 纪实 返程

面试官:小伙子,听说你看过ThreadLocal源码?(万字图文深度解析ThreadLocal)

一枝花算不算浪漫

源码 并发编程 ThreadLocal

Redis稳定性实践

心平气和

redis 缓存 稳定性

尽管HTTP/3已经来了,HTTP/2也得了解啊

清远

网络协议 HTTP

Harbor 2.0的飞跃: OCI 兼容的工件仓库

亨利笔记

Kubernetes 容器 k8s Harbor 镜像

Python 核心技术与进阶 list & tuple

Bonaparte

对于程序员,那些既陌生又熟悉的计算机硬件

架构师修行之路

微软 编程 程序员 cpu 架构师

《零基础学 Java》 FAQ 之 7-Java 中的内存是怎么分配的

臧萌

Java JVM

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