美文网首页
04-Node 异步编程

04-Node 异步编程

作者: Am3 | 来源:发表于2019-10-28 11:49 被阅读0次

Node 异步编程

同步方法和异步方法

  1. 同步方法:立即返回操作结果,在未执行完会阻塞代码执行
  2. 异步方法:不会立即返回操作结果,通过回调函数接受结果,不会阻塞代码执行

异步 API 的执行顺序

当异步函数执行时,由于执行完成的时间不确认,会将对应的回调函数压入事件循环队列 , 继续执行其它代码,当异步函数执行完成后,才开始处理事件循环,调用对应的回调函数

异步编程回调地狱问题

由于异步函数需要通过回调函数来获取执行结果,当我们有多个异步函数需要执行,并且对执行结果有顺序要求,只能将后面的异步函数写在前面的异步函数中,这样就造成了回调地狱问题,回调函数嵌套过深,代码维护困难

如下面代码:

// 回调地狱,
// 需求: 依次读取 1.txt, 2.txt, 3.txt文件,并且输出结果
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);
        });
    });
});

Promise 改造回调地狱代码

Promise 可以将异步 API 的执行和错误的处理进行分离,使用 Promise 改造回调地狱代码,如下所示:

// promise 改造回调地狱代码
// 需求: 依次读取 1.txt, 2.txt, 3.txt文件,并且输出结果

const fs = require('fs');

function readFile(filePath) {
    // 创建 Promise 实列
    const promiseObj = new Promise((resolve, reject) => {
        // resolve 是一个函数, 如果异步API执行成功, 将执行结果传递到Promise外部
        // reject 是一个函数, 如果异步API执行失败, 将失败结果传递到Promise外部
        // 将异步代码放到匿名函数内部
        fs.readFile(filePath, 'utf8', (error, result) => {
            if (error) {
                return reject(error)
            }
            return resolve(result)
        })
    })
    return promiseObj
}

// 依次调用函数
let r1 = readFile('1.txt');
let r2 = readFile('2.txt');
let r3 = readFile('3.txt');

// then 成功时候执行
// catch 失败时候执行
r1.then(result => {
    console.log(result);
    // 在 then 内部返回下一个 promise对象, 方便使用 链式编程
    return r2
}).then(result => {
    console.log(result);
    return r3
}).then(result => {
    console.log(result);
}).catch(error => {
    console.log(error);
})

async 和 await

  • async

    1. 普通函数定义前加 async 关键字,普通函数变成异步函数
    2. 异步函数默认返回 promise 对象
    3. 在异步函数中使用 return 返回结果,结果会被包裹在 promise 对象中,return 关键字代替了 resolve
    4. 在异步函数中使用 throw 抛出程序异常
    5. 调用异步函数后使用 then 获取异步函数执行的结果
    6. 使用 catch 获取错误信息
  • await

    • await 关键字只能出现在异步函数中
    • await 后面只能写 promise 对象,不能写其他类型的 API
    • await 关键字 可以暂停异步函数向下执行,直到返回执行结果

异步函数改造回调地狱代码

// 异步函数改造回调地狱代码

const fs = require('fs');
// promisify方法改造代码, 让异步函数返回 promise 对象, 以支持异步函数语法
const promisify = require('util').promisify;
// promisify 改造 fs.readFile 方法
const readFile = promisify(fs.readFile);

// await 只能在异步函数里面, 所以需要加上 async
async function run(){
    // 将 readFile() 返回结果赋值给 变量, 然后打印
    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()

相关文章

  • 04-Node 异步编程

    Node 异步编程同步方法和异步方法异步 API 的执行顺序异步编程回调地狱问题Promise 改造回调地狱代码a...

  • ES6学习--异步编程--Generator

    异步编程 : (异步编程的语法目的就是让异步编程更像同步编程) 回调函数利用回调函数实现异步编程本身没有问题, 问...

  • JavaScript异步编程好文摘要

    JavaScript之异步编程简述JavaScript异步编程

  • 认识异步编程

    认识异步编程 本章主要介绍异步编程的概念和作用,Java中异步编程的场景以及不同异步编程场景应使用什么技术实现。 ...

  • part1整理

    函数式编程:JavaScript函数式编程指南 异步编程:异步编程 Promise源码 JavaScript基础知...

  • 论异步编程

    相信本书介绍了CompletableFuture,大家就会认识到什么是异步编程。异步编程的好处。 异步编程最大好处...

  • 读书笔记#Java异步编程实战-上

    Java异步编程实战 chap1 认识异步编程 异步编程概念与作用在使用同步编程方式时,由于每个线程同时只能发起一...

  • Combine 基础知识

    摘自《SwiftUI和Combine编程》---《Combine异步编程》 响应式异步编程模型 将“状态变化”看作...

  • 关于node.js的那些事(四)—异步编程的优势与难点

    有异步I/O,必有异步编程。异步编程有它的优势,也有它的难点,下面我们就这门语言异步编程的优势和难点来展开谈...

  • 异步编程的前世今生

    异步编程的前世今生 1、为什么需要异步编程 异步编程是相对同步编程来说的,开发项目时,开发者总是希望,程序的执行顺...

网友评论

      本文标题:04-Node 异步编程

      本文链接:https://www.haomeiwen.com/subject/xsavvctx.html