当前位置: 代码迷 >> 综合 >> 【node】异步编程之异步函数promise、async、await
  详细解决方案

【node】异步编程之异步函数promise、async、await

热度:56   发布时间:2023-11-22 21:18:25.0

异步编程之异步函数

一、简介

node.js是一个Javascript运行环境(runtime environment),实质是对Chrome V8引擎进行了封装;node.js不是一个 JavaScript 框架,也不是浏览器端的库,node.js是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与PHP、Python、Perl、Ruby 等服务端语言平起平坐的脚本语言。

1.1 特点

  • 异步IO
  • 事件与回调函数
  • 单线程(javascript语言的特点)
  • 跨平台

1.2 异步IO

本文着重讲解异步编程中的异步函数,由于JS的运行机制是单线程异步执行程序
示例:
在这里插入图片描述

在这里插入图片描述

所以在程序设定时会涉及大量异步函数,此时ES6给我们提供了Promise对象去封装异步操作。

const fs = require('fs');
function p1() {
    // 返回promise对象return new Promise((reslove,reject)=>{
    fs.readFile('./1.txt','utf-8',(err,result)=>{
    if(err!=null){
    // 传给外部then方法reject(err);}else{
    // 传给外部catch方法reslove(result);}})
})
}
function p3() {
    // 返回promise对象return new Promise((reslove,reject)=>{
    fs.readFile('./3.txt','utf-8',(err,result)=>{
    if(err!=null){
    // 传给外部then方法reject(err);}else{
    // 传给外部catch方法reslove(result);}})
})
}
function p2() {
    // 返回promise对象return new Promise((reslove,reject)=>{
    fs.readFile('./2.txt','utf-8',(err,result)=>{
    if(err!=null){
    // 传给外部then方法reject(err);}else{
    // 传给外部catch方法reslove(result);}})
})
}p1()
.then((res)=>{
    //接收reslove传过来的参数console.log(res);return p2();
})
.then(res=>{
    //接收reslove传过来的参数console.log(res);return p3();
})
.then(res=>{
    //接收reslove传过来的参数console.log(res);
})

虽然ES6提供对的promise对象有效解决了回调地狱以及更方便的回调函数解决方案,但这代码总会出现过长且重复代码过多的问题,于是ES7给我们提供了一个promise的语法糖——async/await,这个为我们节省了大量的代码空间。接下来就介绍一下这个使用的语法糖:
异步函数是异步编程语法的终极解决方案,它可以让我们将异步代码写成同步的形式,让代码不再有回调函数嵌套,使代码变得清晰明了

const fn = async ()=>{
    };
//等同于
async function fn() {
    }

async关键字

  1. 普通函数定义前加async关键字 普通函数变成异步函数
  2. 异步函数默认返回promise对象
  3. 异步函数内部使用return关键字返回结果 结果会被包裹在promise对象中 return关键字代替了resolve方法
  4. 异步函数内部使用throw关键字抛出异常
  5. 调用异步函数再调用then方法获取异步函数执行结果
  6. 调用异步函数再调用catch方法获取异步函数执行的错误信息
async function fn() {
    throw '发生了一些错误'return 123;
}fn().then((data)=>{
    console.log(data);
}).catch(err=>{
    console.log(err);
})

await关键字

  1. await关键字只能出现在异步函数中
  2. await promise await后面只能写promise对象 写其他类型的API是不可以的
  3. await 关键字可暂停异步函数向下执行 直到promise返回结果
async function p1() {
    return 'p1';
}
async function p2() {
    return 'p2';
}
async function p3() {
    return 'p3';
}
async function run() {
    let r1= await p1();let r2=await p2();let r3=await p3();console.log()    
}run();

nodejs中异步函数的应用

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();

总结

异步函数的目的是为了让代码 的可读性更高,并且让异步执行函数在一定条件下成为同步执行函数。这样既方便代码的可执行性,也提高了代码的可读性。

  相关解决方案