写点什么

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

评论

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

教你用SQL实现统计排名

Simon

MySQL

ARTS 打卡第三周(200525-200531)

老胡爱分享

ARTS 打卡计划

ARTS 挑战打卡第七周(200622-200628)

老胡爱分享

ARTS 打卡计划

ARTS挑战打卡第八周(200629-200705)

老胡爱分享

ARTS 打卡计划

朱嘉明 算力革命背后是分配制度革命 没有算力就没有未来

CECBC

区块链 数字货币 数字经济

一个人的精益

escray

学习 面试

ARTS挑战打卡第六周(200615-200621)

老胡爱分享

ARTS 打卡计划

非IT行业大企程序员讲述MIS系统开发案例

Philips

Java 企业信息化 .net core 计算机程序设计艺术 企业开发

企业信息化到底重不重要?

代码制造者

低代码 零代码 信息化 编程开发 运营管理

从雕像到肖像画,这位设计师用 GAN 和 PS 复原了他眼中的古罗马皇帝「群像」

程序员生活志

ARTS 打卡第四周(200601-200607)

老胡爱分享

ARTS 打卡计划

当地铁站都比你更努力

escray

学习 面试

Axure导出为PDF

波菠菜

深圳区块链支付系统开发,USDT支付系统服务商

13530558032

交易所合约跟单开发方,数字资产合约跟单系统搭建

13530558032

ARTS 打卡第二周(200518-200524)

老胡爱分享

ARTS 打卡计划

马方业:区块链就是新未来 区块链就是新财富

CECBC

区块链 新未来 新财富

ARTS挑战打卡第五周(200608-200614)

老胡爱分享

ARTS 打卡计划

JeecgBoot手记

卧石漾溪

Truncate用法详解

Simon

MySQL

浅谈备受开发者好评的.NET core敏捷开发工具,讲讲LEARUN工作流引擎

Learun

工作流 开发工具 计算机程序设计艺术 表单

定时任务最简单的3种实现方法(超实用)

王磊

Java 定时任务

用科学的方法理解每日优鲜

石云升

新零售 每日优鲜 多快好省 科学分析

巧用SQL拼接语句

Simon

MySQL sql

高频面试题——你真的搞懂物理内存与虚拟内存了吗

大柚子

操作系统 内存管理 虚拟内存 物理内存

Redis追命连环问,你能回答到第几问?(上)Redis简介,数据类型及缓存雪崩缓存击穿缓存穿透

大柚子

Java redis 缓存 面试 后端

小米的护城河

石云升

小米 护城河

MySQL如何快速插入数据

Simon

MySQL 数据库

程序员不愿996,创建6个涉黄平台,涉案5000余万元!

程序员生活志

程序员

一文讲透布隆过滤器

架构精进之路

布隆过滤器

区块链交易所系统开发内容,数字货币交易所搭建

13530558032

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