四段代码看懂 callback、promise、async/await

异步方法一般都有回调函数,若多个异步方法的输出结果存在依赖关系,回调函数就会发生嵌套,很不优雅,将其封装成 Promise,然后通过 .then() 调用、.catch() 捕获错误就好很多了。

手动封装 Promise 实在太过麻烦,高版本的 Node 提供了 promisify 方法可以直接将回调函数包装成 Promise,大大简化了操作。

而使用 Async/Await 的方法来调用 Promise 可以用同步的方式写异步代码。

初始化

1
2
$ npm init -y
$ touch test.js

callback

1
2
3
4
5
6
7
8
const fs = require('fs')

fs.readFile('./package.json', (err, data) => {
if (err) return console.log(err)

let data1 = JSON.parse(data)
console.log(data.name)
})

Promise

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const fs = require('fs')

// 创建 Promise
function readFileAsync(path) {
return new Promise((resolve, reject) => {
fs.readFile(path, (err, data) => {
if (err) reject(err)

let data = JSON.parse(data)
resolve(data)
})
})
}

// 调用 Promise
readFileAsync('./package.json')
.then(data => {
console.log(data.name)
})
.catch(err => {
console.log(err)
})

Promisify

1
2
3
4
5
6
7
8
9
10
11
12
const fs = require('fs')
const util = require('util')

const readAsync1 = util.promisify(fs.readFile)

readAsync('./package.json')
.then(data => {
console.log(JSON.parse(data).name)
})
.catch(err => {
console.log(err)
})

Async/Await

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const fs = require('fs')
const util = require('util')
const readAsync = util.promisify(fs.readFile)

readAsync('./package.json').then(data => {
console.log(JSON.parse(data).name)
})(async () => {
try {
let data = await readAsync('./package.json')
data = JSON.parse(data)

console.log(data.name)
} catch (error) {
console.log(error)
}
})()
0%