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

异步编程之异步函数

一、简介

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

总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值