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)
})
优点:
-
解决了回调地狱的问题,使得原本多层级的嵌套代码,变成了链式调用,让代码更清晰。
-
异常捕获和处理异常简单多啦,只要在最后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)
})
缺点:
- 原来的任务被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)
})
优点:
- Generator 函数将异步操作表示得很简洁
缺点:
-
流程管理不方便(何时执行第一阶段、何时执行第二阶段)。没有实现自动化的流程管理,需要手动调用next()。
-
一般的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)
})
优点:
-
实现自动化流程管理
-
代码中没有一堆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()
优点:
- 代码清晰,不用像 Promise 写一大堆 then 链,解决了回调地狱的问题。
缺点:
- await 将异步代码改造成同步代码,如果多个异步操作没有前后依赖,这时使用 await 会降低性能。
扩展阅读,关于Promise
==============
Promise不是简单的语法糖,而是一种关于异步编程的规范,目的是将异步处理对象和处理规则进行规范化,为异步编程提供统一接口。
以下几段代码都是等价的,都是将普通回调函数Promise化。
1. 直接用ES6原生Promise对象
const fs = require(‘fs’)
const readFileAsync = (path) => {
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
2H-1715484912055)]
[外链图片转存中…(img-boBrTnQe-1715484912056)]
[外链图片转存中…(img-v2cGXtC6-1715484912056)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!