JavaScript发展这些年,关于异步场景解决方案的变化

const fs = require(‘fs’)

const path = ‘./package.json’

const readFileAsync = (path) => {

return new Promise((resolve, reject) => {

fs.readFile(path, (err, data) => {

if (err) reject(err)

else resolve(data)

})

})

}

readFileAsync(path)

.then(data => {

console.log(JSON.parse(data))

})

.catch(err => {

console.log(err)

})

优点:

  1. 解决了回调地狱的问题,使得原本多层级的嵌套代码,变成了链式调用,让代码更清晰。

  2. 异常捕获和处理异常简单多啦,只要在最后catch一下。

readFileAsync(path1)

.then(data => {

console.log(JSON.parse(data))

return readFileAsync(path2)

})

.then(data => {

console.log(JSON.parse(data))

return readFileAsync(path3)

})

.then(data => {

console.log(JSON.parse(data))

})

.catch(err => {

console.log(err)

})

缺点:

  1. 原来的任务被Promise 包装了一下,不管什么操作,一眼看去都是一堆 then,原来的语义变得不清楚。

阶段3-基础,Generator生成器函数 + Promise

===============================

Generator生成器是ES6(ES2015)的新特性。当我们调用一个生成器函数的时候,它并不会立即执行, 而是需要我们手动的去执行迭代操作(next方法)。

也就是说,你调用生成器函数,它会返回给你一个迭代器。迭代器会遍历每个中断点。

通俗的讲,当你在执行一个函数的时候,你可以在某个点暂停函数的执行,并且做一些其他工作,然后再返回这个函数继续执行, 甚至是携带一些新的值,然后继续执行。

const util = require(‘util’)

const fs = require(‘fs’)

const path1 = ‘./package1.json’

const path2 = ‘./package2.json’

const path3 = ‘./package3.json’

const readFileAsync = function *() {

yield util.promisify(fs.readFile)(path1)

yield util.promisify(fs.readFile)(path2)

yield util.promisify(fs.readFile)(path3)

}

const g = readFileAsync()

g.next().value

.then(data => {

console.log(JSON.parse(data))

return g.next().value

})

.then(data => {

console.log(JSON.parse(data))

return g.next().value

})

.then(data => {

console.log(JSON.parse(data))

return g.next().value

})

.catch(err => {

console.log(err)

})

优点:

  1. Generator 函数将异步操作表示得很简洁

缺点:

  1. 流程管理不方便(何时执行第一阶段、何时执行第二阶段)。没有实现自动化的流程管理,需要手动调用next()。

  2. 一般的yield关键字后面会跟上Promise化的异步函数,因此要在then方法里面调用下一个next方法。于是在代码中任然有一堆then存在。

阶段3-进阶,Co库 + Generator生成器函数 + Promise

=====================================

Co库是一个为Node.js和浏览器打造的基于Generator生成器函数的流程控制工具,借助于Promise,可以使用更加优雅的方式编写非阻塞代码。TJ大神所写。

**注意:**Co库使用时,yield后面一定要返回一个Promise对象

const co = require(‘co’)

const util = require(‘util’)

const fs = require(‘fs’)

const path1 = ‘./package1.json’

const path2 = ‘./package2.json’

const path3 = ‘./package3.json’

co(function *() {

const data1 = yield util.promisify(fs.readFile)(path1)

console.log(JSON.parse(data1))

const data2 = yield util.promisify(fs.readFile)(path2)

console.log(JSON.parse(data2))

const data3 = yield util.promisify(fs.readFile)(path3)

console.log(JSON.parse(data3))

return ‘test’

}).then(data => {

console.log(data)

// 输出 test

}).catch(err => {

console.log(err)

})

优点:

  1. 实现自动化流程管理

  2. 代码中没有一堆then啦

阶段4,Async/Await + Promise 统一世界

==============================

在ES7(还未正式标准化)中引入了Async函数的概念,使用async关键字,可以轻松地达成之前使用阶段3方法所做到的工作。8.x之后的node版本可以直接使用。

const util = require(‘util’)

const fs = require(‘fs’)

const path1 = ‘./package1.json’

const path2 = ‘./package2.json’

const path3 = ‘./package3.json’

const readFileAsync = util.promisify(fs.readFile)

async function init() {

const data1 = await readFileAsync(path1)

console.log(JSON.parse(data1))

const data2 = await readFileAsync(path2)

console.log(JSON.parse(data2))

const data3 = await readFileAsync(path3)

console.log(JSON.parse(data3))

}

init()

优点:

  1. 代码清晰,不用像 Promise 写一大堆 then 链,解决了回调地狱的问题。

缺点:

  1. await 将异步代码改造成同步代码,如果多个异步操作没有前后依赖,这时使用 await 会降低性能。

扩展阅读,关于Promise

==============

Promise不是简单的语法糖,而是一种关于异步编程的规范,目的是将异步处理对象和处理规则进行规范化,为异步编程提供统一接口。

以下几段代码都是等价的,都是将普通回调函数Promise化。

1. 直接用ES6原生Promise对象

const fs = require(‘fs’)

const readFileAsync = (path) => {

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
2H-1715484912055)]

[外链图片转存中…(img-boBrTnQe-1715484912056)]

[外链图片转存中…(img-v2cGXtC6-1715484912056)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值