Node.js异步编程的三种方案及其优缺点

1.同步API与异步API

  同步API:只有当前API执行完成后,才能继续执行下一个API;异步API:当前API的执行不会阻塞后续代码的执行。

2.两者之前的区别

  ①同步API可以从返回值中拿到API执行的结果,但是异步API是不可以的。异步API获取返回值是通过回调函数(自己定义函数让别人去调用)
  ②代码执行顺序不同

3.在异步API中,如果后面的代码需要依赖异步API返回的结果,应该如何处理呢?

  举个例子:在这个文件中需要依次读取三个文件,当第一个文件读取完成之后在读取第二个文件,第二个读取完成之后在读取第三个文件。共有三种方法:

1)嵌套

const fs = require('fs')

fs.readFile('./1.txt', 'utf8', (err, result1) => {
    console.log(result1);    
    fs.readFile('./2.txt', 'utf8', (err, result2) => {
        console.log(result2);
        fs.readFile('./3.txt', 'utf8', (err, result3) => {
            console.log(result3);
        })
    })
})

  这样可以实现依次读取文件,但是存在多层回调的问题,会形成回调地狱。

2)Promise

const fs = require('fs')

function p1() {
    return new Promise((resolve, reject) => {
        fs.readFile('./1.txt', 'utf8', (err, result) => {
            resolve(result)
        })
    })
}
function p2() {
    return new Promise((resolve, reject) => {
        fs.readFile('./2.txt', 'utf8', (err, result) => {
            resolve(result)
        })
    })
}
function p3() {
    return new Promise((resolve, reject) => {
        fs.readFile('./3.txt', 'utf8', (err, result) => {
            resolve(result)
        })
    })
}
p1().then((r1) => {
    console.log(r1);
    return p2()
})
    .then((r2) => {
        console.log(r2);
        return p3()
    })
    .then((r3) => {
        console.log(r3);
    })

3)异步函数

  promise可以解决回调地狱的问题,但是promise写法有些复杂。在ES7中,新增的异步函数对promise对象进行了分装,暴露了一些接口,同时也可以解决回调地狱的问题。

const fs = require('fs')

// 改造现有异步函数API,让其返回promise对象,从而支持异步函数语法
const promisify = require('util').promisify;
// 调用promisify方法改造现有异步API,让其返回promise对象
const readFile = promisify(fs.readFile)

async function run () {
    let r1 = await readFile('./1.txt', 'utf8')
    let r2 = await readFile('./2.txt', 'utf8')
    let r3 = await readFile('./3.txt', 'utf8')
    console.log(r1);
    console.log(r2);
    console.log(r3);
}

run()

你可能感兴趣的:(前端)